您好,登錄后才能下訂單哦!
環境:2臺VM虛擬機CentOS7 X86_64 位系統
一、2臺虛擬機器要關閉iptables 關閉firewalld, 關閉selinux,開啟時間同步參數,保證2臺虛擬機器的時間是一致的
二、2臺虛擬機的sshd服務要開啟22端口(Xenon代碼中只支持通過22端口來ssh相互之間訪問)
三、Xenon服務啟動用戶要和mysql服務的啟動用戶必須是相同的用戶才行,此實例模擬演示都是采用的系統用戶mysql.
四、2臺虛擬機系統用戶mysql,要允許shell登錄,而且2臺虛擬機mysql用戶之間能互相免秘鑰訪問
五、2臺虛擬機系統上安裝的mysql的版本必須是mysql5.7版本以上(含mysql5.7),而且2臺mysql要開啟半同步復制參數(Xenon是基于半同步復制的)
六、2臺虛擬機系統上都要安裝sshpass軟件
七、2臺虛擬機系統上的Xenon.json配置文件中要調用shell命令來執行相關的命令。由于xenon服務是系統普通用戶mysql啟動的,所以通過xenon.json文件執行命令行命令時,
需要授權mysql系統用戶相關命令的sudo權限,才能夠執行系統命令
八、xenon.json配置文件中要配置幾個賬戶權限,來讓xenon服務能夠自動創建mysql的主從復制關系,以及自動切換mysql復制關系和自動故障恢復等等操作
提示:在xenon.json配置文件中配置mysql復制賬戶和密碼時,xenon服務是能夠自動創建復制賬戶的,并且給的權限是%的權限。并且自動創建復制關系。但是在測試中發現會報錯,提示復制賬戶權限不正確。
于是在此次演示過程中,本人自己直接在2臺mysql的實例上創建相同的復制賬戶。
命令如下:
grant replication slave on *.* to repuser@'172.16.0.%' identified by 'repuser9slave'; flush privileges; ##復制賬戶和密碼
grant all on *.* to root@'127.0.0.1' identified by 'rrtestjianwei';flush privileges;
##在xenon構建的HA+ mysql集群中,建議讀寫都在master庫上,所以在xenon維護的mysql集群中,slave庫是不允許寫的.master主庫發生故障后,節點slave庫要發生切換變成主庫,所以原先的只讀權限要通過這個賬戶登錄數據庫修改權限變為可讀寫
grant all on *.* to codeuser@'172.16.0.%' identified by 'rrtestjianwei';flush privileges;
##允許代碼連接庫的賬戶和密碼,以及IP地址,建議此處直接給綁定網卡的服務ip 172.16.0.100作為唯一的代碼連接庫的地址
九、2臺虛擬機的IP地址和綁定 /etc/hosts
系統IP地址
10.0.0.130 172.16.0.130
10.0.0.131 172.16.0.131
提示:在2臺物理機器上測試的時候,一開始由于2臺物理機器插內網線的網口不相同(一個在網口2,一個在網口3),使得配置內網ip地址的網卡也不相同,在2臺機器xenon.json配置文件中綁定服務ip的到網卡em1上。
雖然后面的測試,2臺機器的上的xenon服務都能成功啟動,并且也可以把各自的mysql服務拉起來,在2臺機器上/data/xenon/bin/xenoncli cluster add ip:8801 添加對方的節點mysql。
并且服務ip也可以成功的綁定到預先設置的em1上。接著后面的問題出現了:在綁定有服務ip的機器上通過這個服務ip和他自身的內網ip是可以登錄數據庫的,但是在沒有綁定服務ip機器上通過這個服務ip登錄對端的mysql服務
居然被拒絕登錄mysql服務(登錄mysql服務的權限確定給的沒問題)
于是讓機房把這2臺內網線重新到插到相同的網卡上,然后在相同的網卡上配置各自的內網ip地址,同時有在xenon.json配置文件中指定綁定服務ip到插內網線的網卡上。此時以上的問題得以解決
綁定 /etc/hosts:
[root@mgr01 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.0.130 mgr01
172.16.0.131 mgr03
[root@mgr03 ~]# cat /etc/hosts
172.16.0.130 mgr01
172.16.0.131 mgr03
提示:下面的配置步驟要在2臺虛擬機器上都要執行的
第一、安裝二進制版本mysql5.7.24
tar xf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
cd /usr/local/
ln -sv mysql-5.7.24-linux-glibc2.12-x86_64 mysql
echo "export PATH=$PATH:/usr/local/mysql/bin" >/etc/profile.d/mysql.sh
source /etc/profile
初始化mysql:
mysqld --defaults-file=/data/mysql/mysql3306/my3306.cnf --initialize
啟動mysql:
mysqld --defaults-file=/data/mysql/mysql3306/my3306.cnf &
[root@mgr01 ~]# cat .my.cnf
[client]
socket = /tmp/mysql.sock
user=root
password=123456
prompt="(\\u@\\'mgr01':\\p)[\\d]>"
登錄mysql進行賬戶授權:
grant replication slave on *.* to repuser@'172.16.0.%' identified by 'repuser9slave'; flush privileges;
grant all on *.* to root@'127.0.0.1' identified by 'rrtestjianwei';flush privileges;
grant all on *.* to codeuser@'172.16.0.%' identified by 'rrtestjianwei';flush privileges;
提示:2臺機器上都執行上面的步驟安裝mysql.要求/data/mysql/mysql3306/my3306.cnf 配置文件都要開啟MySQL的半同步復制的參數
下面的參數要寫入到/data/mysql/mysql3306/my3306.cnf 配置文件:
plugin-load="semisync_master.so;semisync_slave.so"
rpl_semi_sync_master_enabled=OFF
rpl_semi_sync_slave_enabled=ON
rpl_semi_sync_master_wait_no_slave=ON
rpl_semi_sync_master_timeout=1000000000000000000 ##參數目的就是不讓半同步復制轉化為異步復制
第二、安裝xenon服務
介紹:
Xenon是一個自包含的二進制文件,在操作系統級別不需要其他系統庫。 它基于Linux構建。 沒有關于MS Windows和OS / X的提示,并且該版本與Windows和OS / X不兼容。
它是一個獨立的應用程序。 配置為與MySQL后端一起運行時,因此需要mysqld。
Xenon使用GTID半同步并行復制技術,MySQL版本最好是5.7或更高版本。 有關詳細信息,請參見my.cnf
地址:https://github.com/radondb/xenon/blob/master/docs/config/MySQL.md
下面的mysql的半同步復制參數要寫入到/data/mysql/mysql3306/my3306.cnf 配置文件
plugin-load="semisync_master.so;semisync_slave.so"
rpl_semi_sync_master_enabled=OFF
rpl_semi_sync_slave_enabled=ON
rpl_semi_sync_master_wait_no_slave=ON
rpl_semi_sync_master_timeout=1000000000000000000
由于xenon服務是go語言開發的,所以需要go環境來運行,且要求需要Go版本1.8或更高版本
2.1安裝go環境
需要Go版本1.8或更高版本(對于ubuntu是“ sudo apt install golang”,對于centOS / redhat是“ yum install golang”)。
采用二進制安裝golang ,版本是go1.9.3.linux-amd64.tar.gz
go 二進制包下載地址:
wget https://storage.googleapis.com/golang/go1.9.3.linux-amd64.tar.gz
tar xf go1.11.linux-amd64.tar.gz -C /usr/local/
[root@mgr01 ~]# tail -2 /etc/profile
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
[root@mgr01 ~]# go version
go version go1.11 linux/amd64
2.2 安裝xenon服務
1下載:
git clone https://github.com/radondb/xenon.git
cd xenon
2.編譯構建
make build
ls bin/
xenon xenoncli
3.配置config
cp xenon/conf/xenon-sample.conf.json /etc/xenon/xenon.json
[mysql@mgr01 ~]$ cat /data/xenon/bin/config.path
/etc/xenon/xenon.json
這里需要注意的是,運行xenon的帳戶必須與mysql帳戶一致,例如使用ubuntu帳戶啟動xenon,它需要ubuntu mysql的啟動和mysql目錄的權限。
這與傳統的mysql地方不一樣,不需要mysql帳戶,運行xenon帳戶的同事就是mysql帳戶。
注意:以下是命令行示例的摘要。 為簡單起見,我們假設xenon在您的指定的路徑下。 如果不是,replace xenon with /path/to/xenon.
在xenon命令路徑中,您需要有一個名為config.path的文件,它是xenon.json文件的絕對路徑。 確保使用-c或--config指定xenon_config_file的位置。
2.3、2臺機器創建系統用戶mysql
2臺機器創建系統用戶mysql并且2臺機器之間實現mysql用戶免秘鑰訪問,而且mysql系統賬戶只能是22端口才能訪問
useradd mysql
passwd mysql
授權mysql用戶sudo權限可以執行下面的命令:
[root@mgr01 ~]# tail -1 /etc/sudoers
mysql ALL=(ALL) NOPASSWD: /usr/sbin/ip
2臺虛擬機之間系統用戶mysql相互免秘鑰操作:
ssh-keygen -t rsa
.ssh/authorized_keys
chmod 600 .ssh/authorized_keys
2.4、啟動xenon服務:
172.16.0.130 機器xenon.json內容如下:(172.16.0.131配置文件要把IP跟換成自己內網卡172.16.0.131地址)
[mysql@mgr01 ~]$ cat /etc/xenon/xenon.json
{
"server":
{
"endpoint":"172.16.0.130:8801"
},
"raft":
{
"meta-datadir":"raft.meta",
"heartbeat-timeout":1000,
"election-timeout":3000,
"leader-start-command":"sudo /usr/sbin/ip a a 172.16.0.100/16 dev eth0 && arping -c 3 -A 172.16.0.100 -I eth0",
"leader-stop-command":"sudo /usr/sbin/ip a d 172.16.0.100/16 dev eth0"
},
"mysql":
{
"admin":"root",
"passwd":"rrtestjianwei",
"host":"127.0.0.1",
"port":3306,
"basedir":"/usr/local/mysql",
"defaults-file":"/data/mysql/mysql3306/my3306.cnf",
"ping-timeout":1000,
"master-sysvars":"super_read_only=0;read_only=0;sync_binlog=default;innodb_flush_log_at_trx_commit=default",
"slave-sysvars": "super_read_only=1;read_only=1;sync_binlog=1000;innodb_flush_log_at_trx_commit=2"
},
"replication":
{
"user":"repuser",
"passwd":"repuser9slave"
},
"backup":
{
"ssh-host":"172.16.0.130",
"ssh-user":"mysql",
"ssh-passwd":"rrtestjianwei669",
"ssh-port":22,
"backupdir":"/data/mysql/mysql3306/data",
"xtrabackup-bindir":"/usr/bin",
"backup-iops-limits":100000,
"backup-use-memory": "1GB",
"backup-parallel": 2
},
"rpc":
{
"request-timeout":500
},
"log":
{
"level":"INFO"
}
}
啟動命令:
172.16.0.130機器操作:
[mysql@mgr01 ~]$ /data/xenon/bin/xenon -c /etc/xenon/xenon.json > /data/xenon/xenon.log 2>&1 &
添加xenon節點:
[mysql@mgr01 xenon]$ /data/xenon/bin/xenoncli cluster add 172.16.0.131:8801
2019/12/08 23:13:29.937943 [WARNING] cluster.prepare.to.add.nodes[172.16.0.131:8801].to.leader[]
2019/12/08 23:13:29.938024 [WARNING] cluster.canot.found.leader.forward.to[172.16.0.130:8801]
2019/12/08 23:13:29.950792 [WARNING] cluster.add.nodes.to.leader[].done
查看xenon節點:
[mysql@mgr01 ~]$ /data/xenon/bin/xenoncli cluster status
+-------------------+--------------------------------+---------+---------+--------------------------+---------------------+----------------+-------------------+
| ID | Raft | Mysqld | Monitor | Backup | Mysql | IO/SQL_RUNNING | MyLeader |
+-------------------+--------------------------------+---------+---------+--------------------------+---------------------+----------------+-------------------+
| 172.16.0.130:8801 | [ViewID:16 EpochID:1]@LEADER | RUNNING | ON | state:[NONE]? | [ALIVE] [READWRITE] | [true/true] | 172.16.0.130:8801 |
| | | | | LastError: | | | |
+-------------------+--------------------------------+---------+---------+--------------------------+---------------------+----------------+-------------------+
| 172.16.0.131:8801 | [ViewID:16 EpochID:1]@FOLLOWER | RUNNING | ON | state:[NONE]? | [ALIVE] [READONLY] | [true/true] | 172.16.0.130:8801 |
| | | | | LastError: | | | |
+-------------------+--------------------------------+---------+---------+--------------------------+---------------------+----------------+-------------------+
(2 rows)
操作完成過6s后,有最初的都是read_only變成了一個[READONLY和一個READWRITE
172.16.0.131機器操作:
[mysql@mgr03 ~]$ /data/xenon/bin/xenon -c /etc/xenon/xenon.json > /data/xenon/xenon.log 2>&1 &
[mysql@mgr03 ~]$ /data/xenon/bin/xenoncli cluster add 172.16.0.130:8801
[mysql@mgr03 ~]$ /data/xenon/bin/xenoncli cluster status
+-------------------+--------------------------------+---------+---------+--------------------------+---------------------+----------------+-------------------+
| ID | Raft | Mysqld | Monitor | Backup | Mysql | IO/SQL_RUNNING | MyLeader |
+-------------------+--------------------------------+---------+---------+--------------------------+---------------------+----------------+-------------------+
| 172.16.0.131:8801 | [ViewID:16 EpochID:1]@FOLLOWER | RUNNING | ON | state:[NONE]? | [ALIVE] [READONLY] | [true/true] | 172.16.0.130:8801 |
| | | | | LastError: | | | |
+-------------------+--------------------------------+---------+---------+--------------------------+---------------------+----------------+-------------------+
| 172.16.0.130:8801 | [ViewID:16 EpochID:1]@LEADER | RUNNING | ON | state:[NONE]? | [ALIVE] [READWRITE] | [true/true] | 172.16.0.130:8801 |
| | | | | LastError: | | | |
+-------------------+--------------------------------+---------+---------+--------------------------+---------------------+----------------+-------------------+
操作完成過6s后,有最初的都是read_only變成了一個[READONLY和一個READWRITE
同時服務IP172.16.0.100地址綁定到了10.0.0.130 的機器上
[mysql@mgr01 xenon]$ ip a|grep 172.16.0.100
inet 172.16.0.100/16 scope global eth0
通過服務ip登錄mysql,然后創建測試庫:
[mysql@mgr01 xenon]$ mysql -ucodeuser -h272.16.0.100 -p'rrtestjianwei' -e "create database test03;show databases;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test01 |
| test02 |
| test03 |
+--------------------+
[mysql@mgr01 xenon]$
進行故障演示,kill 掉主庫,嘗試通過服務ip連接庫,大約25s才能鏈接成功主庫,然后在連接后的新主庫進行刪除數據
主庫切換在25s就可以完成
進行故障演示,
1.登錄master庫,執行shutdown關掉主庫,嘗試通過服務ip連接庫,大約17s到20s才能重新綁定服務ip到master庫的機器網卡上,然后通過這個服務ip成功連接主庫,然后就可以操作對數據庫的進行查看,寫入,更新數據了
(物理服務器多次測試得出的)
2.登錄master庫的服務器,kill -9 掉mysql的進程, 然后master機器上的xenon會在4s到11s內自動把master機器的mysql服務拉起來,然后在綁定服務ip到master的網卡上,然后通過這個服務ip成功連接主庫,就可以操作對數據庫的進行查看,寫入,更新數據了
(物理服務器多次測試得出的)
3..登錄master庫的服務器,移走數據目錄data,關閉master庫的mysql服務,此時雖然經過1m分鐘左右服務ip已經飄到另外一臺mysql,但是此時,這個庫只能讀,不行寫。寫入時會夯筑 (物理服務器多次測試得出的)
4.如果只是shutdown關閉slave庫的話,通過服務ip地址遠程寫入一條記錄然后在關閉此mysql實例;
命令如下:
[root@slavedb 3306]# mysql -ucodeuser -h292.168.1.100 -p'rrtestjianwei' -e "INSERT INTO test01.test1(username,password,create_time) values('tomcat', 'xiaohuahua',now());"; mysql -e "shutdown;
在執行完shutdown命令后,然后立刻執行下面的插入記錄的命令:
mysql -ucodeuser -h292.168.1.100 -p'rrtestjianwei' -e "INSERT INTO test01.test1(username,password,create_time) values('tomcat', 'xiaohuahua',now());"
此時會夯筑,連續執行多次的話都不行,持續的時間在10-15s,才可以正常寫入,但是此時相同的記錄會被寫入2次到master庫上。(物理服務器多次測試得出的)
如下:
| 31 | tomcat | xiaohuahua | 2019-12-12 17:20:11 |
| 32 | tomcat | xiaohuahua | 2019-12-12 17:23:28 |
| 33 | tomcat | xiaohuahua | 2019-12-12 17:23:28 |
| 34 | tomcat | xiaohuahua | 2019-12-12 17:23:38 |
| 35 | tomcat | xiaohuahua | 2019-12-12 17:23:40 |
| 36 | tomcat | xiaohuahua | 2019-12-12 17:25:32 |
| 37 | tomcat | xiaohuahua | 2019-12-12 17:25:32 |
| 38 | tomcat | xiaohuahua | 2019-12-12 17:25:45 |
+----+----------+------------+---------------------+
5.如果把slave庫的data目錄移走,通過服務ip地址遠程寫入一條記錄然后在關閉此mysql實例;
命令如下:
[root@slavedb ~]# mv data data_bak
[root@slavedb 3306]# ls
binlog data_bak logs my.cnf tmp
[root@slavedb ~]# mysql -ucodeuser -h292.168.1.100 -p'rrtestjianwei' -e "INSERT INTO test01.test1(username,password,create_time)values('tomcat', 'xiaohuahua',now());";mysql -e "shutdown;"
[mysql@localhost xenon]$ mysql -ucodeuser -h292.168.1.100 -p'rrtestjianwei' -e "INSERT INTO test01.test1(username,password,create_time) values('tomcat', 'xiaohuahua',now());"
持續的夯筑時間在10-15s之間,才可以正常寫入,但是此時相同的記錄會被寫入2次到master庫上。(物理服務器多次測試得出的)
39 | tomcat | xiaohuahua | 2019-12-12 17:37:31 |
| 40 | tomcat | xiaohuahua | 2019-12-12 17:37:31 |
| 41 | tomcat | xiaohuahua | 2019-12-12 17:37:42 |
| 42 | tomcat | xiaohuahua | 2019-12-12 17:37:43 |
+----+----------+------------+---------------------+
42 rows in set (0.00 sec)
創建測試表,插入測試語句:
CREATE TABLE `test1` (
`id` int(8) NOT NULL AUTO_INCREMENT,
`username` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
`create_time` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`) #主鍵ID
) ENGINE=innodb AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO test1(username,password,create_time) values('tomcat', 'xiaohuahua',now());
INSERT INTO test1(username,password,create_time) values('tomcat', 'xiaohuahua',now());
下面是dellR620物理機器上配置命令:
/data/xenon/bin/xenon -c /etc/xenon/xenon.json > /data/xenon/xenon.log 2>&1 &
/data/xenon/bin/xenoncli cluster status
/data/xenon/bin/xenoncli cluster add 192.168.1.39:8801,192.168.1.182:8801
/data/xenon/bin/xenoncli cluster remove 192.168.1.105:8801
sudo /usr/sbin/ip a a 192.168.1.100/32 dev em3 && arping -c 3 -A 192.168.1.100 -I em3
sudo /usr/sbin/ip a d 192.168.1.100/32 dev em3
下面是dellR620物理機器上創建數據庫賬戶的命令:
grant replication slave on *.* to repl@'192.168.1.%' identified by 'repl4slave'; flush privileges;
grant all on *.* to root@'127.0.0.1' identified by 'rrtestjianwei';flush privileges;
grant all on *.* to codeuser@'192.168.1.%' identified by 'rrtestjianwei';flush privileges;
下面是dellR620物理機器上其中一臺的xenon.json配置文件內容 :
[root@slavedb ~]# cat /etc/xenon/xenon.json
{
"server":
{
"endpoint":"192.168.1.39:8801"
},
"raft":
{
"meta-datadir":"raft.meta",
"heartbeat-timeout":1000,
"election-timeout":3000,
"leader-start-command":"sudo /usr/sbin/ip a a 192.168.1.100/32 dev em3 && arping -c 3 -A 192.168.1.100 -I em3",
"leader-stop-command":"sudo /usr/sbin/ip a d 192.168.1.100/32 dev em3"
},
"mysql":
{
"admin":"root",
"passwd":"rrtestjianwei",
"host":"127.0.0.1",
"port":3306,
"basedir":"/usr/local/mysql",
"defaults-file":"/data/mysql/3306/my.cnf",
"ping-timeout":1000,
"master-sysvars":"super_read_only=0;read_only=0;sync_binlog=default;innodb_flush_log_at_trx_commit=default",
"slave-sysvars": "super_read_only=1;read_only=1;sync_binlog=1000;innodb_flush_log_at_trx_commit=2"
},
"replication":
{
"user":"repl",
"passwd":"repl4slave"
},
"backup":
{
"ssh-host":"192.168.1.39",
"ssh-user":"mysql",
"ssh-passwd":"rrtestjianwei669",
"ssh-port":22,
"backupdir":"/data/mysql/3306/data",
"xtrabackup-bindir":"/usr/bin",
"backup-iops-limits":100000,
"backup-use-memory": "1GB",
"backup-parallel": 2
},
"rpc":
{
"request-timeout":500
},
"log":
{
"level":"INFO"
}
}
以上是簡單的介紹演示,記錄在此,方便自己查閱,也希望可以幫助有需要的網友們
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。