MySQL InnoDB Cluster 部署及问题解决本人亲验

一. MySQL InnoDB Cluster部署手册

1.1Mysql InnoDB Cluster 工作原理和流程

MySQL InnoDB集群提供了一个集成的,本地的,HA解决方案。Mysq Innodb Cluster是利用组复制的 pxos 协议,保障数据一致性,组复制支持单主模式和多主模式。

1.2MySQL 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 InnoDB Cluster 部署及问题解决本人亲验_第1张图片

二. 基于MySQL 的 InnoDB Cluster 高可用环境部署记录

下面部署采用InnoDB Cluster, 每台服务器实例都运行MySQL Group Replication (即冗余复制机制,内置failover), MGR有两种模式,一种是Single-Primary,一种是Multi-Primary,即单主或者多主。

需求注意:模式Multi-Primary中,所有的节点都是主节点,都可以同时被读写,看上去这似乎更好,但是因为多主的复杂性,在功能上如果设置了多主模式,则会有一些使用的限制,比如不支持Foreign Keys with Cascading Constraints。

2.1 环境准备

这里准备了4台虚拟机用来部署innodb cluster多节点集群环境, 其中:

  1. db-node01、db-node02、db-node03 作为 cluster 节点服务器, 三个节点都要安装 mysql8.0.x 与 mysql-shell
  2. db-route01 作为管理节点服务器,用来负责创建 cluster,并作为 cluster 的路由, 该节点需要安装mysql-shell、mysql-router
  3. 所有节点的python版本要在2.7以上
ip地址                主机名          角色               安装软件
172.16.2.108        db-route01     管理节点1           mysql-shell, mysql-route
172.16.2.109        db-node01      cluster节点1       Mysql5.7, mysql-shell
172.16.2.110        db-node02      cluster节点2       Mysql5.7, mysql-shell
172.16.2.116        db-node03      cluster节点3       Mysql5.7, mysql-shell

[root@db-node01 ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
    
[root@db-node01 ~]# python -V
Python 2.7.5
    
为了方便实验,关闭所有节点的防火墙
[root@MGR-node1 ~]# systemctl stop firewalld
[root@MGR-node1 ~]# firewall-cmd --state
not running
    
关闭每个节点的selinux
[root@MGR-node1 ~]# cat /etc/sysconfig/selinux |grep "SELINUX=disabled"
SELINUX=disabled
[root@MGR-node1 ~]# setenforce 0       
setenforce: SELinux is disabled
[root@MGR-node1 ~]# getenforce         
Disabled

--注:如无法用以上方法关闭可以修改配置文件重启系统关闭selinux

修改/etc/selinux/config文件。将SELINUX=enforcing改为SELINUX=disable,并重起系统
https://jingyan.baidu.com/article/851fbc37a05a0d3e1f15abe3.html
    
配置每个节点的/etc/hosts主机映射, 方便通过节点的hostname进行连接
这一步很重要,否则可能会出现无法同步的情况,因为数据库需要根据member_host同步,如果不配置,默认就是localhost,这样时无法通信的!!!
[root@db-node01 ~]# vi /etc/hosts
...........
172.16.2.108        db-route01     
172.16.2.109        db-node01      
172.16.2.110        db-node02     
172.16.2.116        db-node03     

所有节点进行如下的相关优化配置
[root@db-node01 ~]# cat>>/etc/sysctl.conf <
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@db-node01 ~]# sysctl -p
   
[root@db-node01 ~]# cat>>/etc/security/limits.conf <
mysql soft nproc 65536
mysql hard nproc 65536
mysql soft nofile 65536
mysql hard nofile 65536
EOF
   
[root@db-node01 ~]# cat>>/etc/pam.d/login <
session required /lib/security/pam_limits.so
session required pam_limits.so
EOF
   
[root@db-node01 ~]# cat>>/etc/profile<
if [ $USER = "mysql" ]; then
ulimit -u 16384 -n 65536
fi
EOF
   
[root@db-node01 ~]# source /etc/profile

2.2 在管理节点安装mysql shell 和 mysql-route

[root@db-route01 ~]# cd /usr/local/src/

[root@db-route01 src]#wget https://cdn.mysql.com//Downloads/MySQL-Shell/mysql-shell-8.0.26-linux-glibc2.12-x86-64bit.tar.gz
[root@db-route01 src]#wget https://cdn.mysql.com//Downloads/MySQL-Router/mysql-router-8.0.26-linux-glibc2.12-x86_64.tar.xz

[root@db-route01 src]# ll
总用量 110476
-rw-r--r-- 1 root root 67480788 72 01:20 mysql-router-8.0.26-linux-glibc2.12-x86_64.tar.xz
-rw-r--r-- 1 root root 45645013 611 05:10 mysql-shell-8.0.26-linux-glibc2.12-x86-64bit.tar.gz

[root@db-route01 src]# tar -zvxf mysql-shell-8.0.26-linux-glibc2.12-x86-64bit.tar.gz
[root@db-route01 src]# tar xvJf mysql-router-8.0.26-linux-glibc2.12-x86_64.tar.xz
 
[root@db-route01 src]# mv mysql-router-8.0.26-linux-glibc2.12-x86_64 mysql-route
[root@db-route01 src]# mv mysql-shell-8.0.26-linux-glibc2.12-x86-64bit mysql-shell
[root@db-route01 src]# mv mysql-route /usr/local/
[root@db-route01 src]# mv mysql-shell /usr/local/
 
[root@db-route01 src]# vi /etc/profile
..............
export PATH=$PATH:/usr/local/mysql-shell/bin/:/usr/local/mysql-route/bin/
 
[root@db-route01 src]# source /etc/profile
 
[root@db-route01 src]# mysqlsh --version
mysqlsh   Ver 8.0.26 for Linux on x86_64 - for MySQL 8.0.26 (MySQL Community Server (GPL))

 
[root@db-route01 src]# mysqlrouter --version
MySQL Router  Ver 8.0.26 for Linux on x86_64 (MySQL Community - GPL)

2.3 在三个cluster节点安装和部署Mysql及 mysql-shell

1) 安装mysql-shell  (三个节点同样操作)
[root@db-node01 ~]# cd /usr/local/src/
[root@db-route01 src]#wget https://cdn.mysql.com//Downloads/MySQL-Shell/mysql-shell-8.0.26-linux-glibc2.12-x86-64bit.tar.gz
[root@db-node01 src]# ll mysql-shell-8.0.26-linux-glibc2.12-x86-64bit.tar.gz
-rw-r--r-- 1 root root 45645013 611 05:10 mysql-shell-8.0.26-linux-glibc2.12-x86-64bit.tar.gz
 
[root@db-node01 src]# tar -zvxf mysql-shell-8.0.26-linux-glibc2.12-x86-64bit.tar.gz
[root@db-node01 src]# mv mysql-shell-8.0.26-linux-glibc2.12-x86-64bit.tar.gz
[root@db-node01 src]# mv mysql-shell /usr/local/
 
[root@db-node01 src]# echo "export PATH=$PATH:/usr/local/mysql-shell/bin/" >> /etc/profile
[root@db-node01 src]# source /etc/profile
 
[root@db-node01 ~]# mysqlsh --version
mysqlsh   Ver 8.0.26 for Linux on x86_64 - for MySQL 8.0.26 (MySQL Community Server (GPL))
 
2) 安装mysql5.7  (三个节点同样操作)
使用yum方式安装Mysql5.7,参考:https://www.cnblogs.com/kevingrace/p/8340690.html
 
安装MySQL yum资源库
[root@db-node01 ~]# yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
     
安装MySQL 5.7
[root@db-node01 ~]# yum install -y mysql-community-server
     
启动MySQL服务器和MySQL的自动启动
[root@db-node01 ~]# systemctl start mysqld.service
[root@db-node01 ~]# systemctl enable mysqld.service
     
设置登录密码
由于MySQL从5.7开始不允许首次安装后使用空密码进行登录!为了加强安全性,系统会随机生成一个密码以供管理员首次登录使用,
这个密码记录在/var/log/mysqld.log文件中,使用下面的命令可以查看此密码:
[root@db-node01 ~]# cat /var/log/mysqld.log|grep 'A temporary password'
2019-01-11T05:53:17.824073Z 1 [Note] A temporary password is generated for root@localhost: TaN.k:*Qw2xs
     
使用上面查看的密码TaN.k:*Qw2xs 登录mysql,并重置密码为123456
[root@db-node01 ~]# mysql -p                 #输入默认的密码:TaN.k:*Qw2xs
.............
mysql> set global validate_password_policy=0;
Query OK, 0 rows affected (0.00 sec)
     
mysql> set global validate_password_length=1;
Query OK, 0 rows affected (0.00 sec)
     
mysql> set password=password("123456");
Query OK, 0 rows affected, 1 warning (0.00 sec)
     
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
     
查看mysql版本
[root@db-node01 ~]# mysql -p123456
........
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.24    |
+-----------+
1 row in set (0.00 sec)
    
==================================

你可能感兴趣的:(mysql,innodb)