mysql Innodb 集群(Ubuntu20.4操作系统,mysql8.0)
主要参考地址Mysql Innodb cluster集群搭建 - 小时候挺菜 - 博客园
创建了四台虚拟机,一台用来负责管理,另外三台是主从节点,一个主,两个从。
管理节点安装mysql-shell和mysql-router,主从节点三个均安装mysql和mysql-shell
后期名称都改为:manager,master和slave1,slave2
本次操作均使用root最高权限
需要注意将每个服务器的hostname进行修改,分别修改成manager,master和slave1,slave2
在配置mysql的配置文件时,配置内容需要和这里的名称一致
sudo hostnamectl set-hostname 名字
一、更新源
vim /etc/apt/sources.list
#Ubuntu 20.04
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
sudo apt-get update
二、更改服务器系统时间
# 查看时区
date -R
# 默认 Sun, 23 Aug 2020 14:21:29 +0000
# +0800 表示相对于UTC标准时间多了8小时0分0秒, +0000 表示是UTC时间
# 我们应该用+0800
# 查看服务器时间
date "+%Y-%m-%d %H:%M:%S"
# 服务器时间,输入命令进行选择,全部输入数字即可(选择的数字可能会有变动,请根据实际情况变通)
# 4. Asia (亚洲)
# 9. China (中国)
# 1. Beijing Time (北京时间)
# 1. Yes (确认)
tzselect
# 复制生成的配置文件到 /etc/localtime生效
sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 再次查看是否生效
date "+%Y-%m-%d %H:%M:%S"
三、安装mysql8.0(Ubuntu20.4默认安装mysql的版本为8.0)
# 安装mysql
sudo apt-get install -y mysql-server
# 初始化设置
sudo mysql_secure_installation
# 输入命令进行选择
# N(选择N,不会继续拿给你密码的强制校验)
# 123456(输入密码。根据实际情况设置)
# 123456(重复输入)
# N(选择N,不删除匿名用户)
# N(选择N,允许root远程连接)
# N(选择N,不删除test数据库)
# Y(选择Y,修改权限立即生效)
如图:
四、添加MySQL APT 存储库
# 进去链接地址下载文件包 https://dev.mysql.com/downloads/repo/apt/
# 参考的文档地址(https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/#apt-repo-setup)
sudo dpkg -i /PATH/version-specific-package-name.deb (/PATH/version-specific-package-name.deb为下载的文件名)
sudo apt-get update
sudo apt-get install mysql-apt-config
sudo apt-get install mysql-shell
五、环境准备(所有服务器都要操作)
1.关闭防火墙
1.关闭防火墙,关闭方法因系统不同,所以不列出
2.关闭selinux(Centos),关闭方法因系统不同,所以不列出
2.修改/etc/hosts文件
将四台服务器的ip分别映射成manager,master和slave1,slave2
# 注意本服务器的127.0.0.1可能会出现多条变量,只需要保留127.0.0.1 localhost
# 直接执行以下命令
cat>>/etc/hosts <<EOF
192.168.1.111 manager
192.168.1.129 master
192.168.1.130 slave1
192.168.1.131 slave2
EOF
3.优化配置
提示:未明白其中含义,只是根据网上文档进行了一样的配置
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
sysctl -p
cat>>/etc/security/limits.conf <<EOF
mysql soft nproc 65536
mysql hard nproc 65536
mysql soft nofile 65536
mysql hard nofile 65536
EOF
cat>>/etc/pam.d/login <<EOF
session required /lib/security/pam_limits.so
session required pam_limits.so
EOF
cat>>/etc/profile<<EOF
if [ $USER = "mysql" ]; then
ulimit -u 16384 -n 65536
fi
EOF
source /etc/profile
六、设置mysql的密码以及操作权限(所有服务器都要操作)
mysql -uroot -p(默认安装时没有密码,直接回车进入)
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
flush privileges;
七、主节点服务器
修改/etc/mysql/mysql.conf.d/mysqld.cnf
# 增加内容
bind-address = 0.0.0.0(将原来的127.0.0.1修改)
default-time_zone = '+8:00'
sql_mode=''
#复制框架
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
八、创建cluster集群
1.进到master的服务器,登陆mysql-shell
mysqlsh
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的服务器,登陆mysql-shell,连接master,创建cluster
mysqlsh
# 连接01
shell.connect('root@master:3306');
# 创建一个 cluster,命名为 'myCluster',命名可自定义,并复制给变量cluster,后边根据此变量进行操作
var cluster = dba.createCluster('myCluster');
# 创建成功后,查看cluster状态
cluster.status();
# 创建后,可以看到master已经添加进cluster,并且状态是读写
{
"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"
}
}
}
}
3.进到slave1的服务器,添加slave1节点,和上面一样的方法,先安装好mysql和mysql-shell
注意
配置文件/etc/mysql/mysql.conf.d/mysqld.cnf中server_id需要改成 server_id=2
同时 loose-group_replication_local_address="slave1:33061"
# 登陆shell,执行配置
mysqlsh
shell.connect('root@localhost:3306');
dba.configureLocalInstance();
# 在/etc/mysql/mysql.conf.d/mysqld.cnf增加
loose-group_replication_allow_local_disjoint_gtids_join=ON
# 重启mysql后,通过manager节点的shell,将slave1添加到cluster:
# 添加实例
cluster.addInstance('root@slave1:3306');
# 创建成功后,查看cluster状态
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"
}
}
}
}
4.添加slave2节点
和slave1一样,添加slave2节点,注意server_id和loose-group_replication_local_address需要修改成3和slave2:33061
九、安装mysqlrouter
# 在manager节点上,安装router
sudo apt-get install -y mysql-router
# 执行命令
mysqlrouter --bootstrap root@master:3306 -d /etc/mysqlrouter/myrouter --user=root
Please enter MySQL password for root:
# 这里会在etc目录下产生mysqlrouter 目录, 并生成router配置文件,默认通过route连接mysql后, 6446端口连接后可以进行读写操作. 6447端口连接后只能进行只读操作.
# 然后启动mysql-route
./start.sh(我在mysqlrouter执行的)
# 查看route进程
ps -ef|grep myroute
netstat -tunlp
# 这样就可以使用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
mysql -u root -h manager_ip -P 6446 -p
# 验证cluster集群
# 1.登陆后,新建一个表,往里面写进数据,查看从节点数据会不会同步;
# 2.关闭master的mysql服务,route将主节点自动切换到slave1,slave1从只读变为可读写,重新启动master mysql后,master变为只读模式。
十、备用参数
#无权查看集群状态
#查看创建的集群
cluster=dba.getCluster(); #获取当前集群
cluster.status(); #查看集群状态
查询节点名称()
mysql -uroot -p123456
stop group_replication;
delete from sakura.t1 where id>=121071;
SET GLOBAL group_replication_bootstrap_group = OFF;
set global group_replication_allow_local_disjoint_gtids_join=on;
start group_replication;
总结
以上就是今天要讲的内容,本文简单介绍了Mysql Innodb 集群的安装与使用,希望对您有所帮助。