Mysql Innodb cluster集群搭建


之前搭建過一個Mysql Ndb cluster集群,但是mysql版本是5.7的,看到官網上mysql8的還是開發者版本,所以嘗試搭建下mysql Innodb cluster集群。

  • MySQL的高可用架構無論是社區還是官方,一直在技術上進行探索,這么多年提出了多種解決方案,比如MMMMHANDB ClusterGalera ClusterInnoDB Cluster, 騰訊的PhxSQLMySQL Fabric ,aliSQL
  • NDB:基於集群的引擎-數據被自動切分並復制到數個機器上(數據節點), 適合於那些需要極高查詢性能和高可用性的應用, 原來是為愛立信的電信應用設計的。 NDB提供了高達99.999%的可靠性,在讀操作多的應用中表現優異。 對於有很多並發寫操作的應用, 還是推薦用InnoDB
  • 本次部署采用InnoDB Cluster. 每台服務器實例都運行MySQL Group Replication(冗余復制機制,內置failover
  • MGR有兩種模式,一種是Single-Primary,一種是Multi-Primary,即單主或者多主。
  • 注意:Multi-Primary模式中,所有的節點都是主節點,都可以同時被讀寫,看上去這似乎更好,但是因為多主的復雜性,在功能上如果設置了多主模式,則會有一些使用的限制,比如不支持Foreign Keys with Cascading Constraints。

 

 

 

一.工作原理

MySQL InnoDB集群提供了一個集成的,本地的,HA解決方案。Mysq Innodb Cluster是利用組復制的 pxos 協議,保障數據一致性,組復制支持單主模式和多主模式。

MySQL InnoDB集群由以下幾部分組成:
-   MySQL Servers with Group Replication:向集群的所有成員復制數據,同時提供容錯、自動故障轉移和彈性。MySQL Server 5.7.17或更高的版本。
-   MySQL Router:確保客戶端請求是負載平衡的,並在任何數據庫故障時路由到正確的服務器。MySQL Router 2.1.3或更高的版本。
-   MySQL Shell:通過內置的管理API創建及管理Innodb集群。MySQL Shell 1.0.9或更高的版本。

各個組件的關系和工作流程如下:

 

 

 

 

 

 

 

 

 

二.集群方案

我創建了四台虛擬機,一台用來負責管理,另外三台是主從節點,一個主,兩個從。

管理節點安裝mysql-shell和mysql-router,主從節點三個均安裝mysql和mysql-shell

后期名稱都改為:manager,master和slave1,slave2

 

mysql,mysql shell 和mysql router的安裝包如下:

mysql:mysql-8.0.17-linux-glibc2.12-x86_64.tar.xz

mysql-shell:mysql-shell-8.0.17-linux-glibc2.12-x86-64bit.tar.gz

mysql-router:mysql-router-8.0.17-linux-glibc2.12-x86_64.tar.xz

 

根據官方的文檔 https://dev.mysql.com/doc/refman/8.0/en/mysql-innodb-cluster-userguide.html,mysql-shell需要python環境,至少在2.7版本以上,所以在安裝使用前,需要提前部署好python環境。

 

三.環境准備(所有服務器都要操作)

1.關閉防火牆,關閉方法因系統不同,所以不列出

2.關閉selinux(Centos),關閉方法因系統不同,所以不列出

3.修改/etc/hosts文件,將四台服務器的ip分別映射成manager,master和slave1,slave2

4.優化配置

[root@localhost ~]# cat>>/etc/sysctl.conf <<EOF
fs.aio-max-nr = 1048576
fs.file-max = 681574400
kernel.shmmax = 137438953472
kernel.shmmni = 4096
kernel.sem = 250 32000 100 200
net.ipv4.ip_local_port_range = 9000 65000
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586
EOF
   
[root@localhost  ~]# sysctl -p
   
[root@localhost  ~]# cat>>/etc/security/limits.conf <<EOF
mysql soft nproc 65536
mysql hard nproc 65536
mysql soft nofile 65536
mysql hard nofile 65536
EOF
   
[root@localhost  ~]# cat>>/etc/pam.d/login <<EOF
session required /lib/security/pam_limits.so
session required pam_limits.so
EOF
   
[root@localhost  ~]# cat>>/etc/profile<<EOF
if [ $USER = "mysql" ]; then
ulimit -u 16384 -n 65536
fi
EOF
   
[root@localhost  ~]# source /etc/profile

 

四.在主節點安裝mysql和mysql-shell

1.解壓安裝包

tar xvf mysql-8.0.17-linux-glibc2.12-x86_64.tar.xz
tar zxvf mysql-shell-8.0.17-linux-glibc2.12-x86-64bit.tar.gz 
mv  mysql-8.0.17-linux-glibc2.12-x86_64 /usr/local/mysql/
mv zxvf mysql-shell-8.0.17-linux-glibc2.12-x86-64bit /usr/local/mysql-shell/

2.添加用戶並賦權

groupadd mysql
useradd -g mysql mysql
cd /usr/local/mysql/
mkdir data
cd ..
chown -R mysql:mysql mysql

3.修改環境變量

vi /etc/profile
.......... export PATH
=$PATH:/usr/local/mysql-shell/bin/:/usr/local/mysql/bin/
source /etc/profile

4.在/etc/下增加配置文件my.cnf

[mysqld]  
character-set-server=utf8
port=3306   
socket=/tmp/mysql.sock
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
log-error=/usr/local/mysql/data/mysqld.log
pid-file=/usr/local/mysql/data/mysql.pid
user = mysql
tmpdir = /tmp
default-storage-engine=INNODB


#復制框架
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
max_connections=200
max_allowed_packet=16M

#組復制設置
#server必須為每個事務收集寫集合,並使用XXHASH64哈希算法將其編碼為散列
transaction_write_set_extraction=XXHASH64
#告知插件加入或創建組命名,UUID
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
#server啟動時不自啟組復制,為了避免每次啟動自動引導具有相同名稱的第二個組,所以設置為OFF。
loose-group_replication_start_on_boot=off
#告訴插件使用IP地址,端口33061用於接收組中其他成員轉入連接
loose-group_replication_local_address="master:33061"
#啟動組server,種子server,加入組應該連接這些的ip和端口;其他server要加入組得由組成員同意
loose-group_replication_group_seeds="master:33061,slave1:33061,slave2:33061"
loose-group_replication_ip_whitelist="master,slave1,slave2,manager"
loose-group_replication_bootstrap_group=off
# 使用MGR的單主模式
loose-group_replication_single_primary_mode=on
loose-group_replication_enforce_update_everywhere_checks=off
disabled_storage_engines = MyISAM,BLACKHOLE,FEDERATED,CSV,ARCHIVE

5.安裝mysql

/usr/local/mysql/bin/mysqld --initialize-insecure --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

6.進入到mysql的base目錄,設置開機自啟動

#加入到service服務
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
 
#加入到開機自啟動列表
chkconfig --add mysqld

7.登陸mysql,修改登陸密碼(這里因為是不安全安裝,所以密碼為空,沒有默認密碼,登陸后直接回車就可以進入客戶端頁面)

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

 

五.創建cluster集群

1.進到master的 mysql-shell 的安裝目錄,登陸mysql-shell

bin/mysqlsh
mysql-js> shell.connect('root@localhost:3306');
#連接成功后
#配置實例
dba.configureLocalInstance();
#此時會讓選擇創建管理cluster的用戶,我選1,使用root管理,並且允許遠程登陸“%”
#接着查看實例狀態
dba.checkInstanceConfiguration("root@localhost:3306");

如果出現:

You can now use it in an InnoDB Cluster.
 
{
    "status": "ok"
}

說明配置成功。

2.登陸manager管理節點,講router和shell都解壓到/usr/local/文件夾下分別為mysql-route和mysql-shell

3.登陸manager節點的shell,連接master,創建cluster

bin/mysqlsh 
 
# 連接01
mysql-js> shell.connect('root@master:3306');
 
# 創建一個 cluster,命名為 'myCluster'
mysql-js> var cluster = dba.createCluster('myCluster');
 
# 創建成功后,查看cluster狀態
mysql-js> cluster.status();

創建后,可以看到master已經添加進cluster,並且狀態是讀寫,我這里用別人的狀態圖,表示一下:

mysql-js> cluster.status();
{
    "clusterName": "myCluster",
    "defaultReplicaSet": {
        "name": "default",
        "primary": "master:3306",
        "status": "OK_NO_TOLERANCE",
        "statusText": "Cluster is NOT tolerant to any failures.",
        "topology": {
            "master:3306": {
                "address": "master:3306",
                "mode": "R/W",
                "readReplicas": {},
                "role": "HA",
                "status": "ONLINE"
            }
        }
    }
}

4.添加slave1節點

和上面一樣的方法,先安裝好mysql和mysql-shell,注意配置文件中server_id需要改成

server_id=2

同時,

loose-group_replication_local_address="slave1:33061"

登陸shell,執行配置

bin/mysqlsh 
 
mysql-js> shell.connect('root@localhost:3306');
mysql-js> dba.configureLocalInstance();

停掉mysql服務,在配置文件my.cnf末尾添加配置:

loose-group_replication_allow_local_disjoint_gtids_join=ON

重啟mysql后,通過manager節點的shell,將slave1添加到cluster:

# 添加實例
cluster.addInstance('root@slave1:3306');
 
# 創建成功后,查看cluster狀態
mysql-js> cluster.status();

成功后狀態:

mysql-js> cluster.status();
{
    "clusterName": "myCluster",
    "defaultReplicaSet": {
        "name": "default",
        "primary": "master:3306",
        "status": "OK_NO_TOLERANCE",
        "statusText": "Cluster is NOT tolerant to any failures.",
        "topology": {
            "master:3306": {
                "address": "master:3306",
                "mode": "R/W",
                "readReplicas": {},
                "role": "HA",
                "status": "ONLINE"
            },
            "slave1:3306": {
                "address": "slave1:3306",
                "mode": "R/O",
                "readReplicas": {},
                "role": "HA",
                "status": "ONLINE"
            }
        }
    }
}

5.和slave1一樣,添加slave2節點,注意server_id和loose-group_replication_local_address需要修改成3和slave2:33061

六.安裝mysql-router

在manager節點上,安裝router:

/usr/local/mysql-route/bin/mysqlrouter --bootstrap root@master:3306 -d myrouter --user=root

這里會在當前目錄下產生mysql-router 目錄, 並生成router配置文件,默認通過route連接mysql后, 6446端口連接后可以進行讀寫操作. 6447端口連接后只能進行只讀操作.

然后啟動mysql-route

myrouter/start.sh

查看route進程:

ps -ef|grep myroute 
netstat -tunlp|grep (route的pid)
這樣就可以使用MySQL客戶端連接router了.  下面驗證下連接router:
 
a) 管理節點本機mysql-shell連接:
mysqlsh --uri root@localhost:6446
b) 管理節點本機mysql連接:
mysql -u root -h 127.0.0.1 -P 6446 -p
c) 遠程客戶機通過route連接mysql


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM