1. 程式人生 > >mysql主從 、Mycat讀寫分離、haproxy高可用

mysql主從 、Mycat讀寫分離、haproxy高可用

Mysql 遷移流程   核心原則,不能影響線上的服務   原 mysql 開啟 binlog

配置 my.cnf server-id       = 11 log_bin         = mysql-bin binlog-format   = mixed

新增同步使用者  create user ‘repl’@’%’ IDENTIFIED BY ‘lper’; grant replication client,replication slave on *.* to [email protected]’%’;

使用 xtrabackup 線上備份 mysql 安裝 percona-xtrabackup,備份 yum install percona-xtrabackup-24 innobackupex –slave-info –user=”root” –password=”toor”  –host=”127.0.0.1” –no-timestamp ./backup    安裝一臺新的mysql伺服器,利用備份恢復資料 應用日誌 innobackupex –apply-log backup 拷貝恢復資料 innobackupex –copy-back ./backup 恢復許可權 chown -R mysql:mysql /var/lib/mysql 把(原)mysql作為(master),新(mysql)做(slave)實現主從同步 配置 my.cnf 略 … … reset slave; change master to master_host=’192.168.1.11’,\                  master_user=’repl’,master_password=’lper’,\                  master_log_file=”mysql-bin.000001”, master_log_pos=607; start slave;

在 mysql master 上執行 use mysql update user set Host=’%’ where User=”root”; flush privileges;

切換流程     停止原 mysql     吧新的 mysql 升級成 master     stop  slave;     reset slave;     reset master;     修改 php 指令碼,使用新的 mysql 服務

搭建 mysql 叢集     搭建 1 主 2 從     增加 1 半同步複製 slave     半同步複製配置

——————semi sync master—————–#

檢視 mysql 外掛 show plugins;

安裝半同步外掛 install plugin rpl_semi_sync_master soname ‘semisync_master.so’; 開啟半同步 set global rpl_semi_sync_master_enabled=1; 等待超時時間 設定此引數值(ms),為了防止半同步複製在沒有收到確認的情況下發生堵塞,如果Master在超時之前沒有收到任何確認,將恢復到正常的非同步複製,並繼續執行沒有半同步的複製操作。 set global rpl_semi_sync_master_timeout=1000;

檢視狀態 show global variables like ‘%rpl_semi%’; show global status like ‘%rpl_semi%’;

#——————semi sync slave—————–# 檢視 mysql 外掛 show plugins;

安裝半同步外掛 install plugin rpl_semi_sync_slave soname ‘semisync_slave.so’; 開啟半同步 set global rpl_semi_sync_slave_enabled=1;

檢視狀態 show global variables like ‘%rpl_semi%’; 重啟 IO 執行緒 stop  slave io_thread; start slave io_thread;

#———————-my.cnf ———————# plugin-load     = “rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so” rpl_semi_sync_slave_enabled  = 1 rpl_semi_sync_master_enabled = 1 rpl_semi_sync_master_timeout = 3000

#———————-mha node——————–# 安裝 mha node 節點包 yum install -y perl-ExtUtils-MakeMaker perl-CPAN perl-DBD-MySQL

安裝 mha4mysql-node perl Makefile.PL  make make install

#——————–mha manager——————-#

# mha 官方網站 https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads

安裝 mha node 節點包 yum install -y perl-ExtUtils-MakeMaker perl-CPAN perl-DBD-MySQL

安裝 mha4mysql-node perl Makefile.PL  make make install

安裝 mha manager 節點 安裝依賴軟體包 yum install -y perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes

安裝 mha 管理節點 perl Makefile.PL 

[Core Features] - DBI                   …loaded. (1.627) - DBD::mysql            …loaded. (4.023) - Time::HiRes           …loaded. (1.9725) - Config::Tiny          …loaded. (2.14) - Log::Dispatch         …loaded. (2.41) - Parallel::ForkManager …loaded. (1.18) - MHA::NodeConst        …loaded. (0.56) *** Module::AutoInstall configuration finished. Checking if your kit is complete… Looks good

make make install

mha 是依靠 ssh 遠端配置管理 mysql 伺服器的,所以要求管理節點機器到所有 mysql機器能做到 ssh 免密碼登入 /etc/ssh/ssh_config 配置不校驗 host key,不輸人 yes StrictHostKeyChecking no

cd /root/.ssh ssh-keygen -t rsa -b 2048 -N ” -f id_rsa 把私鑰 id_rsa 拷貝給所有 mysql 主機

mha 切換 vip 是靠指令碼實現,vim 編輯指令碼 master_ip_failover 設定 vip (line:35) my $vip = ‘192.168.1.10/24’;  # Virtual IP  cp master_ip_failover  /usr/local/bin/ chmod 755 /usr/local/bin/master_ip_failover

新增 預設配置檔案 /etc/masterha_default.cnf 和 /etc/mha.cnf 配置檔案 touch /etc/masterha_default.cnf

cat /etc/mha.cnf [server default] manager_log=/var/log/mha.log manager_workdir=/var/lib/mha

user=root password=toor

repl_user=repl repl_password=lper

ssh_user=root

ping_interval=1 remote_workdir=/var/lib/mha master_ip_failover_script=/usr/local/bin/master_ip_failover

[server12] candidate_master=1 hostname=mysql12

[server15] candidate_master=1 hostname=mysql15

[server13] hostname=mysql13 no_master=1

[server14] hostname=mysql14 no_master=1

在當前的 master 上手工繫結 vip 執行檢查測試

檢查 ssh 免密碼登入 masterha_check_ssh –conf=/etc/mha.cnf

檢查 mysql 主從配置 masterha_check_repl –conf=/etc/mha.cnf

新增引數 relay_log_purge=0

啟動 mha masterha_manager –conf=/etc/mha.cnf –ignore_last_failover

驗證測試

–remove_dead_master_conf      該引數代表當發生主從切換後,老的主庫的ip將會從配置檔案中移除。 –manger_log                   日誌存放位置 –ignore_last_failover         在預設情況下,如果MHA檢測到連續發生宕機>,且兩次宕機間隔不足8小時的話,則不會進行Failover,之所以這樣限制是為了 避免ping-pong效應。該引數代表忽略上次MHA觸發切換產生的檔案,預設情況下>,MHA發生切換後會在日誌目錄,也就是上面我設定的/data產生app1.failover.complete檔案,下次再次切換的時候如果發現該目錄下存在該檔案將不允許觸發切 換,除非在第一次切換後收到刪除該檔案,為了方便,這裡設定為–ignore_last_failover。

#——————— mycat ——————–# 建立一個用於查詢的使用者 create user ‘read’@’%’ IDENTIFIED BY ‘daer’; grant select on *.* to ‘read’@’%’;

在機器上安裝 java-1.8.0-openjdk-devel 拷貝 mycat 到 /usr/local/

配置 /usr/local/mycat/conf/server.xml 82: <property name=”schemas”>mydb</property> 97: <property name=”schemas”>mydb</property>

配置 /usr/local/mycat/conf/schema.xml <?xml version=”1.0”?> <!DOCTYPE mycat:schema SYSTEM “schema.dtd”> <mycat:schema xmlns:mycat=”http://io.mycat/”>     <schema name=”mydb” checkSQLschema=”false” sqlMaxLimit=”100” dataNode=”dn1”>     </schema>     <dataNode dataHost=”localhost1” database=”mydb” name=”dn1”/>      <dataHost name=”localhost1” maxCon=”1000” minCon=”10” balance=”3” writeType=”0”                dbType=”mysql” dbDriver=”native” switchType=”1”  slaveThreshold=”100”>     <heartbeat>select user()</heartbeat>     <!– can have multi write hosts –>     <writeHost host=”hostMaster” url=”192.168.1.50:3306”user=”root” password=”toor”>           <!– can have multi read hosts –>          <readHost host=”hostS2” url=”mysql12:3306” user=”read” password=”daer” />          <readHost host=”hostS2” url=”mysql13:3306” user=”read” password=”daer” />          <readHost host=”hostS2” url=”mysql14:3306” user=”read” password=”daer” />         <readHost host=”hostS2” url=”mysql15:3306” user=”read” password=”daer” />     </writeHost>     </dataHost> </mycat:schema>

啟動 mycat ,驗證測試 /usr/local/mycat/bin/mycat start

配置檔案注意事項: conf/server.xml 可以不修改,但要注意  <property name=”schemas”>TESTDB</property> 虛擬庫名稱,要和後面對應 schemas是這個使用者下的邏輯資料庫可以有多個邏輯資料庫可以用“,”逗號隔開 使用者名稱和密碼是連線 mycat 的使用者名稱和密碼,與 mysql 例項的使用者名稱密碼無關 mycat預設的普通連線埠是8066,管理連線埠是9066 schema:邏輯資料庫 dataNode:節點 dataHost:節點對應的讀庫寫庫的地址和連線 balance指的負載均衡型別,目前的取值有4種: balance=”0”, 不開啟讀寫分離機制,所有讀操作都發送到當前可用的writeHost上。 balance=”1”,全部的readHost與stand by writeHost參與select語句的負載均衡 balance=”2”,所有讀操作都隨機的在writeHost、readhost上分發。 balance=”3”,所有讀請求隨機的分發到wiriterHost對應的readhost執行,writerHost不負擔讀壓力

switchType指的是切換的模式,目前的取值也有4種: switchType=’-1’ 表示不自動切換 switchType=’1’  預設值,表示自動切換 switchType=’2’  基於MySQL主從同步的狀態決定是否切換,心跳語句為 show slavestatus switchType=’3’  基於MySQL galary cluster的切換機制(適合叢集)(1.4.1),心跳語句為 show status like ‘wsrep%’      WriteType引數設定: writeType=“0”, 所有寫操作都發送到可用的writeHost上。 writeType=“1”,所有寫操作都隨機的傳送到readHost。 writeType=“2”,所有寫操作都隨機的在writeHost、readhost分上發。

配置完成以後連線 mycat 查詢 mysql -uroot -p123456 -h192.168.4.20 -P 8066 -e ‘select @@hostname;’ 多查詢幾次,可以看到輪詢效果

第二臺 mycat 安裝 java-1.8.0-openjdk-devel 拷貝  /usr/local/mycat 到本機相同目錄,啟動服務即可

#————— haproxy keepalived————–# yum 安裝 haproxy  修改 /etc/haproxy/haproxy.cfg listen mycat_3306 *:3306     mode    tcp        # mysql 得使用 tcp 協議     option  tcpka      # 使用長連線     balance leastconn  # 最小連線排程演算法     server  mycat_01 192.168.1.13:8066 check inter 3000 rise 1 maxconn 1000 fall 3     server  mycat_02 192.168.1.14:8066 check inter 3000 rise 1 maxconn 1000 fall 3

啟動服務 可以在伺服器上使用 ss -atn|grep “ESTAB.*8066”  檢視後端和哪臺服務建立連線了

為防止 haproxy 單點故障,配置兩臺 haproxy 使用 keepalived 實現高可用 第二臺 haproxy 配置同第一臺 keepalived 配置 yum 安裝 keepalived 修改配置檔案 keepalived.conf

! Configuration File for keepalived global_defs {     router_id mycat } vrrp_script chk_haproxy {        script “killall -0 haproxy”     # cheaper than pidof        interval 2                      # check every 2 seconds }

vrrp_instance Mycat {     state BACKUP     interface eth0     track_interface {         eth0     }     virtual_router_id 150     priority 200     ! nopreempt     advert_int 2     authentication {         auth_type PASS         auth_pass test_mycat     }     virtual_ipaddress {         192.168.1.100/24 brd 192.168.1.255 dev eth0 label eth0:1     }     track_script {        chk_haproxy weight=0    # +2 if process is present     } }