msyql mgr單主模式 + keepalived + mycat

MySQL MGR單主模式部署

創建MySQL存儲位置及日誌位置

1
2
sudo mkdir -p /data/mysql && sudo mkdir -p /data/logs/mysql
sudo chown -R mysql:mysql /data/mysql && sudo chown -R mysql:mysql /data/logs/mysql

MySql5.7安装(三臺服務器進行同樣操作)

1
2
3
4
5
6
7
##下载所需安装包
cd /opt
sudo wget http://mirrors.ustc.edu.cn/mysql-ftp/Downloads/MySQL-5.7/mysql-server_5.7.34-1ubuntu18.04_amd64.deb-bundle.tar
sudo tar -xvf mysql-server_5.7.34-1ubuntu18.04_amd64.deb-bundle.tar  #解压安装包

sudo wget http://archive.ubuntu.com/ubuntu/pool/main/m/mecab/libmecab2_0.996-10build1_amd64.deb #下载依赖包

tdm-uat-db1上操作

在安装包所在的目录下执行(安装顺序不可更改)

1、安装mysql-common_5.7.34-1ubuntu18.04_amd64.deb

1
2
3
sudo apt install libtinfo5 -y
sudo dpkg -i mysql-common_5.7.34-1ubuntu18.04_amd64.deb

2、安装mysql-community-client_5.7.34-1ubuntu18.04_amd64.deb

1
sudo dpkg -i mysql-community-client_5.7.34-1ubuntu18.04_amd64.deb

3、安装mysql-client_5.7.34-1ubuntu18.04_amd64.deb

1
sudo dpkg -i mysql-client_5.7.34-1ubuntu18.04_amd64.deb

4、安装 mysql-community-server_5.7.29-1ubuntu18.04_amd64.deb

安装过程中会提示缺少依赖包libmecab2:
所以这次先安装依赖包libmecab2

1
sudo dpkg -i libmecab2_0.996-10build1_amd64.deb

然后安装mysql-community-server_5.7.34-1ubuntu18.04_amd64.deb

1
sudo dpkg -i mysql-community-server_5.7.34-1ubuntu18.04_amd64.deb

安装过程中会要求在粉色的大页面上输入root密码,重複输入两次即可。

5、修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

# db1
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /data/mysql
log-error       = /data/logs/mysql/error.log

sql_mode =

user = mysql
bind-address = 0.0.0.0
port = 3306
binlog_checksum = NONE
log-bin = mysql-bin

#hostname来设置id
server-id = 1
#binlog-ignore-db = mysql,information_schema,performance_schema
auto-increment-offset = 9
#auto-increment-increment = 2

#slave_parallel_type = 'logical_clock'
#slave_parallel_workers = 8

#relay_log = relay-bin
gtid_mode = ON
enforce_gtid_consistency = ON
binlog_format = ROW
master_info_repository = TABLE
relay_log_info_repository = TABLE
log-slave-updates = ON

#组复制设置
#server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
transaction_write_set_extraction=XXHASH64
#告知插件加入或创建组命名,UUID
loose-group_replication_group_name="05153196-c2ab-43ae-b355-b9832eacf0b2"
#server启动时不自启组复制,为了避免每次启动自动引导具有相同名称的第二个组,所以设置为OFF。
loose-group_replication_start_on_boot=off
#告诉插件使用IP地址,端口24901用于接收组中其他成员转入连接
loose-group_replication_local_address="192.168.23.81:24901"
#启动组server,种子server,加入组应该连接这些的ip和端口;其他server要加入组得由组成员同意
loose-group_replication_group_seeds="192.168.23.81:24901,192.168.23.82:24901,192.168.23.83:24901"
loose-group_replication_bootstrap_group=off

init-connect = 'SET NAMES utf8mb4'
character-set-server = utf8mb4

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

default_storage_engine = InnoDB
innodb_file_per_table = 1
innodb_open_files = 500
innodb_buffer_pool_size = 64M
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_thread_concurrency = 0
innodb_purge_threads = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 32M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120

bulk_insert_buffer_size = 8M
myisam_sort_buffer_size = 8M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1

interactive_timeout = 604800
wait_timeout = 604800

explicit_defaults_for_timestamp = true

修改MySQL存儲位置後需要修改/etc/apparmor.d/usr.sbin.mysqld

1
2
3
4
5
6
7
8
9
10
11
sudo vim /etc/apparmor.d/usr.sbin.mysqld
# Allow data dir access
/data/mysql/ r,
/data/mysql/** rwk,

# Allow log file access
/data/logs/mysql/ r,
/data/logs/mysql/** rwk,

# 重啟apparmor
sudo systemctl restart apparmor

复制原有的数据到新存储位置

1
2
3
4
sudo systemctl stop mysql
sudo mv /var/lib/mysql /data/mysql
sudo chown -R mysql:mysql /data/mysql && sudo chown -R mysql:mysql /data/logs/mysql
sudo systemctl start mysql && sudo systemctl enable mysql

以上操作在DB2和DB3上面重复操作,配置文件中的server-id根據hostname來修改,如DB2中修改為server-id=2,DB3中修改為server-id=3, loose-group_replication_local_address 设置为自身服务器地址**;**

修改MySQL配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# db2
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /data/mysql
log-error       = /data/logs/mysql/error.log

sql_mode =

user = mysql
bind-address = 0.0.0.0
port = 3306
binlog_checksum = NONE
log-bin = mysql-bin
server-id = 2
#binlog-ignore-db = mysql,information_schema,performance_schema
auto-increment-offset = 9
#auto-increment-increment = 2

#slave_parallel_type = 'logical_clock'
#slave_parallel_workers = 8

#relay_log = relay-bin
gtid_mode = ON
enforce_gtid_consistency = ON
binlog_format = ROW
master_info_repository = TABLE
relay_log_info_repository = TABLE
log-slave-updates = ON

#组复制设置
#server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
transaction_write_set_extraction=XXHASH64
#告知插件加入或创建组命名,UUID
loose-group_replication_group_name="05153196-c2ab-43ae-b355-b9832eacf0b2"
#server启动时不自启组复制,为了避免每次启动自动引导具有相同名称的第二个组,所以设置为OFF。
loose-group_replication_start_on_boot=off
#告诉插件使用IP地址,端口24901用于接收组中其他成员转入连接
loose-group_replication_local_address="192.168.23.82:24901"
#启动组server,种子server,加入组应该连接这些的ip和端口;其他server要加入组得由组成员同意
loose-group_replication_group_seeds="192.168.23.81:24901,192.168.23.82:24901,192.168.23.83:24901"
loose-group_replication_bootstrap_group=off

init-connect = 'SET NAMES utf8mb4'
character-set-server = utf8mb4

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

default_storage_engine = InnoDB
innodb_file_per_table = 1
innodb_open_files = 500
innodb_buffer_pool_size = 64M
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_thread_concurrency = 0
innodb_purge_threads = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 32M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120

bulk_insert_buffer_size = 8M
myisam_sort_buffer_size = 8M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1

interactive_timeout = 604800
wait_timeout = 604800

explicit_defaults_for_timestamp = true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# db3
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /data/mysql
log-error       = /data/logs/mysql/error.log

sql_mode =

user = mysql
bind-address = 0.0.0.0
port = 3306
binlog_checksum = NONE
log-bin = mysql-bin
server-id = 3
#binlog-ignore-db = mysql,information_schema,performance_schema
auto-increment-offset = 9
#auto-increment-increment = 2

#slave_parallel_type = 'logical_clock'
#slave_parallel_workers = 8

#relay_log = relay-bin
gtid_mode = ON
enforce_gtid_consistency = ON
binlog_format = ROW
master_info_repository = TABLE
relay_log_info_repository = TABLE
log-slave-updates = ON

#组复制设置
#server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
transaction_write_set_extraction=XXHASH64
#告知插件加入或创建组命名,UUID
loose-group_replication_group_name="05153196-c2ab-43ae-b355-b9832eacf0b2"
#server启动时不自启组复制,为了避免每次启动自动引导具有相同名称的第二个组,所以设置为OFF。
loose-group_replication_start_on_boot=off
#告诉插件使用IP地址,端口24901用于接收组中其他成员转入连接
loose-group_replication_local_address="192.168.23.83:24901"
#启动组server,种子server,加入组应该连接这些的ip和端口;其他server要加入组得由组成员同意
loose-group_replication_group_seeds="192.168.23.81:24901,192.168.23.82:24901,192.168.23.83:24901"
loose-group_replication_bootstrap_group=off

init-connect = 'SET NAMES utf8mb4'
character-set-server = utf8mb4

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

default_storage_engine = InnoDB
innodb_file_per_table = 1
innodb_open_files = 500
innodb_buffer_pool_size = 64M
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_thread_concurrency = 0
innodb_purge_threads = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 32M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120

bulk_insert_buffer_size = 8M
myisam_sort_buffer_size = 8M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1

interactive_timeout = 604800
wait_timeout = 604800

explicit_defaults_for_timestamp = true

db01設置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 登錄db01 mysql配置
mysql -u root -p
mysql> set sql_log_bin=0;
# 創建複製用戶
mysql> CREATE USER replication@'%' IDENTIFIED WITH 'mysql_native_password' BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
mysql> FLUSH PRIVILEGES;
mysql> CHANGE MASTER TO MASTER_USER='replication',MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
mysql> install plugin group_replication soname 'group_replication.so';
# group_replication_bootstrap_group参数仅在第一台启动的MGR实例上开启,其他实例不要操作
mysql> set global group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> set global group_replication_bootstrap_group=OFF;
msyql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+------------------+-------------+--------------+
| CHANNEL_NAME             | MEMBER_ID                           | MEMBER_HOST     | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+------------------+-------------+--------------+
| group_replication_applier | f2770e08-e2fd-11eb-a6f7-005056b9aeb1 | ub20-tdm-uat-db1 |        3306 | ONLINE       |
+---------------------------+--------------------------------------+------------------+-------------+--------------+

db02 和 db03設置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql -u root -p
mysql> set sql_log_bin=0;
# 創建複製用戶
mysql> CREATE USER replication@'%' IDENTIFIED WITH 'mysql_native_password' BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
mysql> FLUSH PRIVILEGES;
mysql> CHANGE MASTER TO MASTER_USER='replication',MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
# 加載組複製插件
mysql> install plugin group_replication soname 'group_replication.so';
# 開啟複製
mysql> START GROUP_REPLICATION;

# db02 和 db03 開啟複製後查看集群狀況
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+------------------+-------------+--------------+
| CHANNEL_NAME             | MEMBER_ID                           | MEMBER_HOST     | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+------------------+-------------+--------------+
| group_replication_applier | cc8d94a1-e2ff-11eb-bc1d-005056b99f7e | ub20-tdm-uat-db2 |        3306 | ONLINE       |
| group_replication_applier | cf067865-ea95-11eb-b761-005056b9d54d | ub20-tdm-uat-db3 |        3306 | ONLINE       |
| group_replication_applier | f2770e08-e2fd-11eb-a6f7-005056b9aeb1 | ub20-tdm-uat-db1 |        3306 | ONLINE       |
+---------------------------+--------------------------------------+------------------+-------------+--------------+

MyCat安裝(三台服務器進行同樣的操作)

1
2
3
4
5
6
7
# 安裝 JAVA 環境
sudo apt install openjdk-8-jre-headless -y
# 下載 mycat 安裝包
cd /opt
sudo wget http://dl.mycat.org.cn/1.6.7.6/20210303094759/Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz
sudo tar -zxvf Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz
sudo mv mycat /usr/local/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 修改配置文件
sudo vim /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

<!-- 数据库配置,与server.xml中的数据库对应 -->
  <schema name="tdm_uat" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1" />

<!-- 分片配置 -->
  <dataNode name="dn1" dataHost="test1" database="tdm_uat" />

<!-- 物理数据库配置 -->
  <dataHost name="test1" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql" dbDriver="native" switchType="1">
      <heartbeat>select user();</heartbeat>
      <writeHost host="ub20-tdm-uat-db1" url="192.168.23.81:3306" user="root" password="GErAlGL59a">
        <readHost host="ub20-tdm-uat-db2" url="192.168.23.82:3306" user="root" password="GErAlGL59a" />
        <readHost host="ub20-tdm-uat-db3" url="192.168.23.83:3306" user="root" password="GErAlGL59a" />
      </writeHost>
      <writeHost host="ub20-tdm-uat-db2" url="192.168.23.82:3306" user="root" password="GErAlGL59a">
        <readHost host="ub20-tdm-uat-db1" url="192.168.23.81:3306" user="root" password="GErAlGL59a" />
        <readHost host="ub20-tdm-uat-db3" url="192.168.23.83:3306" user="root" password="GErAlGL59a" />
      </writeHost>
      <writeHost host="ub20-tdm-uat-db3" url="192.168.23.83:3306" user="root" password="GErAlGL59a">
        <readHost host="ub20-tdm-uat-db1" url="192.168.23.81:3306" user="root" password="GErAlGL59a" />
        <readHost host="ub20-tdm-uat-db2" url="192.168.23.82:3306" user="root" password="GErAlGL59a" />
      </writeHost>

  </dataHost>
</mycat:schema>

sudo vim /usr/local/mycat/conf/server.xml
# 將配置文件中內容修改成如下,配置mycat用戶和數據庫
<user name="root" defaultAccount="true">
              <property name="password">password</property>
              <property name="schemas">tdm_uat</property>
              <property name="defaultSchema">tdm_uat</property>
      </user>

      <user name="user">
              <property name="password">user</property>
              <property name="schemas">tdm_uat</property>
              <property name="readOnly">true</property>
              <property name="defaultSchema">tdm_uat</property>
      </user>

添加環境變量

1
2
3
4
5
6
7
# 添加環境變量
sudo vim /etc/profile
export PATH=/usr/local/mycat/bin:$PATH

# 保存退出後應用
source /etc/profile

添加到系統服務

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
sudo vim /lib/systemd/system/mycat.service
# 添加以下內容
[Unit]
Description=mycat project
After=mycat.service

[Service]
Type=forking
User=root
Group=root
ExecStart=/usr/local/mycat/bin/mycat start
ExecReload=/usr/local/mycat/bin/mycat restart
ExecStop=/usr/local/mycat/bin/mycat stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

# 保存逃出後啟動
sudo systemctl start mycat

# 添加開機啟動
sudo systemctl enable mycat

# 查看mycat端口是否正常
sudo netstat -lntup | grep 8066

# 測試連接mycat
sudo mysql -u root -p -P8066
password: (輸入在配置文件中的密碼)

# 查看目前目前使用的配置節點,test1=0表示使用第一組配置,也就是db1是寫節點,對應mgr群組的主節點,如發現使用的配置文件和mgr集群的主節點不一致,可先關掉所有讀節點,讓mycat識別到mgr主節點為配置時再開啟讀數據庫並加入集群。
sudo tail -f /usr/local/mycat/conf/dnindex.properties
#update
#Fri Sep 10 11:02:08 UTC 2021
localhost1=0
test1=0
jdbcDefaultHost=0

Keepalived安裝

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# db01
sudo apt install -y keepalived
# 修改配置文件
sudo vim /etc/keepalived/keepalived.conf
global_defs {
router_id web
}

vrrp_script chk_mycat {
script "/home/wiz/scripts/check_mycat.sh"
interval 2
weight -2
}

vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 1
priority 101
advert_int 1
virtual_ipaddress {
192.168.23.85/24
}
track_script {
chk_mycat
}
}

# 編寫檢測mycat存活的腳本
sudo vim /home/wiz/scripts/check_mycat.sh
#!/bin/bash
count=`/opt/mycat/bin/mycat status |grep 'Mycat-server is running' | wc -l`
time=$(date "+%Y-%m-%d %H:%M:%S")
if [ $count = 0 ]; then
echo "$time : count=$count, mycat is not running..." >> /var/log/keepalived_check.log
exit 1 # 返回1说明脚本非正常执行,mycat不在运行中
else
echo "$time : count=$count, mycat is running..." >> /var/log/keepalived_check.log
exit 0 # 返回0说明脚本正常执行,mycat正在运行中
fi
sudo chmod +x /home/wiz/scripts/check_mycat.sh

#啟動 keepalived 並加入開機啟動
sudo systemctl restart keepalived && sudo systemctl enable keepalived

# 查看是否綁定VIP
ip a

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# db02
sudo apt install -y keepalived
# 修改配置文件
global_defs {
router_id web
}

vrrp_script chk_mycat {
script "sudo /home/wiz/scripts/check_mycat.sh"
interval 2
weight -2
}

vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 1
priority 100
advert_int 1
virtual_ipaddress {
192.168.23.85/24
}
track_script {
chk_mycat
}
}

# 編寫檢測mycat存活的腳本
sudo vim /home/wiz/scripts/check_mycat.sh
#!/bin/bash
count=`/opt/mycat/bin/mycat status |grep 'Mycat-server is running' | wc -l`
time=$(date "+%Y-%m-%d %H:%M:%S")
if [ $count = 0 ]; then
echo "$time : count=$count, mycat is not running..." >> /var/log/keepalived_check.log
exit 1 # 返回1说明脚本非正常执行,mycat不在运行中
else
echo "$time : count=$count, mycat is running..." >> /var/log/keepalived_check.log
exit 0 # 返回0说明脚本正常执行,mycat正在运行中
fi
sudo chmod +x /home/wiz/scripts/check_mycat.sh

#啟動 keepalived 並加入開機啟動
sudo systemctl restart keepalived && sudo systemctl enable keepalive
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# db03
sudo apt install -y keepalived
# 修改配置文件
global_defs {
router_id web
}

vrrp_script chk_mycat {
script "sudo /home/wiz/scripts/check_mycat.sh"
interval 2
weight -2
}

vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 1
priority 99
advert_int 1
virtual_ipaddress {
192.168.23.85/24
}
track_script {
chk_mycat
}
}

# 編寫檢測mycat存活的腳本
sudo vim /home/wiz/scripts/check_mycat.sh
#!/bin/bash
count=`/opt/mycat/bin/mycat status |grep 'Mycat-server is running' | wc -l`
time=$(date "+%Y-%m-%d %H:%M:%S")
if [ $count = 0 ]; then
echo "$time : count=$count, mycat is not running..." >> /var/log/keepalived_check.log
exit 1 # 返回1说明脚本非正常执行,mycat不在运行中
else
echo "$time : count=$count, mycat is running..." >> /var/log/keepalived_check.log
exit 0 # 返回0说明脚本正常执行,mycat正在运行中
fi
sudo chmod +x /home/wiz/scripts/check_mycat.sh

#啟動 keepalived 並加入開機啟動
sudo systemctl restart keepalived && sudo systemctl enable keepalive