標籤:ntp伺服器 三台 virtual utf8 art roo pool dde mysql主從
一、概述1.單個MySQL問題
1)不支援高並發數
2)單點故障
3)資料丟失情況
2.主從複製
- 保證伺服器之間的資料同步(主指寫伺服器,從指讀伺服器)
實現過程
1)當寫伺服器有資料寫入時,資料將對應寫入操縱完畢後,再將所有寫入操作寫入本地記錄檔中(源碼:/usr/local/mysql/data、RPM:/var/lib/mysql)
2)在讀伺服器中,一直有兩個線程(I/O線程:拿取寫伺服器新增的記錄檔內容到本地記錄檔;SQL線程:從本地新增的本地記錄檔中進入資料庫進行重放操作)
3)讀伺服器的I/O線程去查詢寫伺服器是否有新增記錄檔內容,如有則將新增日誌內容放在讀伺服器本地記錄檔中
4)讀伺服器的SQL線程檢查本地日誌是否有新內容產生,如有則進行重放(將記錄檔中的SQL語句都執行一次)操作
5)讀伺服器同步完畢後,通知寫伺服器,寫伺服器通知Proxy 伺服器,代理轉告Web,Web告知用戶端寫入完畢
3.讀寫分離
- 由於資料庫查詢較多,寫入較少,因此將讀、寫分離,使用多個讀伺服器,一個寫伺服器
實現過程
1)用戶端訪問Web,如需要資料庫操作,Web將請求轉寄到Proxy 伺服器(Amoeba)
2)Proxy 伺服器通過配置,判斷為讀還是為寫,如為讀,將請求轉寄到讀的伺服器
3)讀伺服器收到請求後,拿取使用者所需資料返回給Proxy 伺服器,代理再轉交給Web,Web再交由用戶端
4)如判斷為寫的操作,將請求轉寄到寫的伺服器
5)寫伺服器收到後,寫入使用者所需資料後,讀伺服器從寫伺服器同步資料,同步完畢後,寫伺服器回應Proxy 伺服器寫入完畢
6)Proxy 伺服器回應Web,Web回應用戶端寫入完畢
實現方式:
二、案例
實驗環境:
- 需要五台伺服器(寫伺服器:master。讀伺服器:slave01、slave02。讀寫調度器:amoeba。用戶端client)
- 需至少有一塊網卡為同一網段IP
寫伺服器master1.環境準備
vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=no BOOTPROTO=static IPADDR=192.168.1.30 NETMASK=255.255.255.0
rm -rf /etc/yum.repos.d/*
vim /etc/yum.repos.d/local.repo [local] name=local baseurl=file:///mnt gpgcheck=0
mount /dev/cdrom /mnt
yum -y install ntp ncurses-devel cmake
vim /etc/ntp.conf server 127.127.1.0 //指定本地作為NTP伺服器 fudge 127.127.1.0 stratum 8 //指定本地優先順序大於網路同步NTP
/etc/init.d/ntpd restart && chkconfig --level 35 ntpd on
2.部署Mysql
tar zxvf /root/mysql-5.5.22.tar.gz -C /usr/src/
cd /usr/src/mysql-5.5.22/
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc/
make &&make install
3.最佳化mysql
cp /usr/src/mysql-5.5.22/support-files/my-medium.cnf /etc/my.cnf
cp /usr/src/mysql-5.5.22/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld && chkconfig --level 35 mysqld on
echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile && source /etc/profile
useradd -M -s /sbin/nologin mysql
chown -R mysql:mysql /usr/local/mysql
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
/etc/init.d/mysqld start
4.配置主從複製
vim /etc/my.cnf 50 log-slave-updates=true //允許從伺服器同步 58 server-id=10 //標識符,三台不能一樣
/etc/init.d/mysqld restart
mysql -u root -p mysql> grant replication slave on *.* to ‘slave‘@‘192.168.1.%‘ identified by ‘123‘; //建立同步處理的使用者,專用於同步 mysql> flush privileges; mysql> show master status; ##記住File的及Position的值,此處為master-bin.000001和337
讀伺服器slave011.環境準備
vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=no BOOTPROTO=static IPADDR=192.168.1.10 NETMASK=255.255.255.0
rm -rf /etc/yum.repos.d/*
vim /etc/yum.repos.d/local.repo [local] name=local baseurl=file:///mnt gpgcheck=0
mount /dev/cdrom /mnt
yum -y install ntp ncurses-devel cmake
ntpdate 192.168.1.30
2.部署Mysql
tar zxvf /root/mysql-5.5.22.tar.gz -C /usr/src/
cd /usr/src/mysql-5.5.22/
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc/
make &&make install
3.最佳化mysql
cp /usr/src/mysql-5.5.22/support-files/my-medium.cnf /etc/my.cnf
cp /usr/src/mysql-5.5.22/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld && chkconfig --level 35 mysqld on
echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile && source /etc/profile
useradd -M -s /sbin/nologin mysql
chown -R mysql:mysql /usr/local/mysql
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
/etc/init.d/mysqld start
4.配置主從複製
vim /etc/my.cnf 50 relay-log=relay-log-bin //指定從伺服器記錄檔名 51 relay-log-index=slave-relay-bin.index //指定從伺服器索引檔案名稱 59 server-id=20
/etc/init.d/mysqld restart
mysql -u root -p mysql> change master to master_host=‘192.168.1.30‘,master_user=‘slave‘,master_password=‘123‘,master_log_file=‘master-bin.000001‘,master_log_pos=333;
選項
master_host:指定主伺服器IP
master_user:指定串連主伺服器使用者
master_password:指定串連主伺服器使用者的密碼
master_log_file:指定主伺服器記錄檔名;主伺服器show master status;查看
master_log_pos:指定主伺服器的位移值;主伺服器show master status;查看
mysql> start slave;
mysql> show slave status \G;
讀伺服器slave021.環境準備
vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=no BOOTPROTO=static IPADDR=192.168.1.20 NETMASK=255.255.255.0
rm -rf /etc/yum.repos.d/*
vim /etc/yum.repos.d/local.repo [local] name=local baseurl=file:///mnt gpgcheck=0
mount /dev/cdrom /mnt
yum -y install ntp ncurses-devel cmake
ntpdate 192.168.1.30
2.部署Mysql
tar zxvf /root/mysql-5.5.22.tar.gz -C /usr/src/
cd /usr/src/mysql-5.5.22/
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc/
make &&make install
3.最佳化mysql
cp /usr/src/mysql-5.5.22/support-files/my-medium.cnf /etc/my.cnf
cp /usr/src/mysql-5.5.22/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld && chkconfig --level 35 mysqld on
echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile && source /etc/profile
useradd -M -s /sbin/nologin mysql
chown -R mysql:mysql /usr/local/mysql
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
/etc/init.d/mysqld start
4.配置主從複製
vim /etc/my.cnf 50 relay-log=relay-log-bin 51 relay-log-index=slave-relay-bin.index 59 server-id=30
/etc/init.d/mysqld restart
mysql -u root -p mysql> change master to master_host=‘192.168.1.30‘,master_user=‘slave‘,master_password=‘123‘,master_log_file=‘master-bin.000001‘,master_log_pos=333; mysql> start slave; mysql> show slave status \G;
讀寫調度器amoeba1.環境準備
vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=no BOOTPROTO=static IPADDR=192.168.1.254 NETMASK=255.255.255.0
2.安裝jdk與amoeba
yum -y erase java-*
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
mv jdk1.6.0_14/ /usr/local/jdk1.6
vim /etc/profile export JAVA_HOME=/usr/local/jdk1.6 export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin export AMOEBA_HOME=/usr/local/amoeba export PATH=$PATH:$AMOEBA_HOME/bin
source /etc/profile && java -version
mkdir /usr/local/amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
3.在主Mysql資料庫建立授權使用者
mysql -u root -p mysql> grant all on *.* to [email protected]‘192.168.1.%‘ identified by ‘123‘;
4.編輯amoeba設定檔
vim /usr/local/amoeba/conf/amoeba.xml 30 <property name="user">hehe</property> //設定串連Amoeba使用者 32 <property name="password">123</property> //設定串連Amoeba使用者115 <property name="defaultPool">master</property>117 <property name="writePool">master</property> 注意刪除<!-- -->的注釋118 <property name="readPool">slaves</property> //定義讀伺服器集區
vim /usr/local/amoeba/conf/dbServers.xml 25 <!-- mysql user --> 26 <property name="user">haha</property> //設定串連Mysql的使用者 28 <property name="password">123</property> //設定串連mysql的密碼**注意刪除<!-- -->的注釋** 43 <dbServer name="master" parent="abstractServer"> 44 <factoryConfig> 45 <!-- mysql ip --> 46 <property name="ipAddress">192.168.1.10</property> //定義寫伺服器IP 47 </factoryConfig> 48 </dbServer> 49 <dbServer name="slave1" parent="abstractServer"> 50 <factoryConfig> 51 <!-- mysql ip --> 52 <property name="ipAddress">192.168.1.20</property> //定義讀伺服器IP 53 </factoryConfig> 54 </dbServer> 55 <dbServer name="slave2" parent="abstractServer"> 56 <factoryConfig> 57 <!-- mysql ip --> 58 <property name="ipAddress">192.168.1.30</property> //定義讀伺服器IP 59 </factoryConfig> 61 </dbServer> 62 <dbServer name="slaves" virtual="true"> 68 <property name="poolNames">slave1,slave2</property> //定義輸入slaves讀伺服器集區的主機 69 </poolConfig>
amoeba start &
netstat -utpln | grep 8066
用戶端client
vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=no BOOTPROTO=static IPADDR=192.168.1.100 NETMASK=255.255.255.0
rm -rf /etc/yum.repos.d/*
vim /etc/yum.repos.d/local.repo[local]name=localbaseurl=file:///mntgpgcheck=0
mount /dev/cdrom /mnt
yum -y install mysql
mysql -u hehe -p -h 192.168.1.254 -P 8066mysql>show databases;mysql>create dabase hehe;mysql>show datasbases;
MySQL主從複製讀寫分離