MySQL主從複製讀寫分離

來源:互聯網
上載者:User

標籤: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回應用戶端寫入完畢

實現方式:

  • 代碼層次:由開發人員內嵌分離代碼,由Web伺服器中網頁做判斷,是讀還是寫

  • 軟體層次:通過第三方軟體,如Amoeba,軟體中寫明讀、寫伺服器位址,由軟體判斷為讀還是寫
二、案例

實驗環境:

  • 需要五台伺服器(寫伺服器: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主從複製讀寫分離

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.