mysql主从配置的基本思路:(个人观点)
1)各个节点都开起bin_log日志
2)master会将变动记录到二进制日志里面;
3)master有一个I/O线程将二进制日志发送到slave;
4) slave有一个I/O线程把master发送的二进制写入到relay日志里面;
5)slave有一个SQL线程,按照relay日志处理slave的数据;
我的具体实现步骤:
1)关闭selinux,简单的描述下我了解到的selinux,selinux是一套安全的机制,功能方面可以一些机制所替代。比如防火墙等系列安全措施
关闭的方法: 将/etc/selinux/config里的SELINUX设置成:disabled(永久关闭) setenforce 0 (临时关闭)
2)下载mysql:(我用的是5.7版本)wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz
a.解压mysq:tar -zxvf mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz
b.移动mysql:sudo mv mysql-5.7.19-linux-glibc2.12-x86_64 /usr/local/mysql
c.使用root用户 创建mysql实例用户及文件
1、 useradd mysql -r -s /sbin/nologin
2、 mkdir -p /usr/local/mysql/mysql_files //数据导入导出目录
3、 创建多实例数据存储目录:sudo mkdir -p /data/mysql_data{1..3}
4、 修改mysql目录的属组及用户:sudo chown root.mysql -R /usr/local/mysql
5、 修改专用目录的属主及属组:sudo chown mysql.mysql -R /usr/local/mysql/mysql_files /data/mysql_data{1..3}
d.mysql的配置文件/etc/my.cnf
vim /etc/my.cnf
添加二进制日志配置,开启二进制(master-bin只是日志文件名称,可以自己指定)
log-bin=master-bin
server-id=1
注意:server-id是要唯一,不然会报错,每个节点指定一个唯一标识符
我的my.cnf:
####################主从这一块的配置 点在这呢
#yzy --- new --- config
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld
mysqladmin = /usr/local/mysql/bin/mysqladmin
log = /tmp/mysql_multi.log
[mysqld1]
datadir = /data/mysql_data1 #设置数据目录
socket = /tmp/mysql.sock1 #设置sock文件存放路径
port = 3306 #设置监听开放端口
user = root #设置运行用户
performance_schema = off #关闭监控
innodb_buffer_pool_size = 32M #设置innodb 缓存大小
bind_address = 0.0.0.0 #设置监听IP地址
skip-name-resolve = 0 #关闭DNS反向解析
log-bin=mysql-bin
server-id=11
[mysqld2]
datadir = /data/mysql_data2
socket = /tmp/mysql.sock2
port = 3307
user = root
performance_schema = off
innodb_buffer_pool_size = 32M
bind_address = 0.0.0.0
skip-name-resolve = 0
log-bin=mysql-bin
server-id=12
[mysqld3]
datadir = /data/mysql_data3
socket = /tmp/mysql.sock3
port = 3308
user = root
performance_schema = off
innodb_buffer_pool_size = 32M
bind_address = 0.0.0.0
skip-name-resolve = 0
log-bin=mysql-bin
server-id=13
e:初始化各个mysql实例:初始化完后会在日志中生成密码,记得保存(会用的到这些初始密码)
1、sudo /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data1
2、sudo /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data2
3、sudo /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data3
d:SSL实例连接各个节点
a、sudo /usr/local/mysql/bin/mysql_ssl_rsa_setup --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data1
b、sudo /usr/local/mysql/bin/mysql_ssl_rsa_setup --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data2
c、sudo /usr/local/mysql/bin/mysql_ssl_rsa_setup --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data3
3)复制多实例脚本到服务管理目录下
sudo cp /usr/local/mysql/support-files/mysqld_multi.server /etc/init.d/mysqld_multi
给予脚本可执行权限:sudo chmod +x /etc/init.d/mysqld_multi
加入service服务管理: sudo chkconfig --add mysqld_multi
添加环境变量
在文件最后面添加内容:sudo vim /etc/profile
export MYSQL_HOME=/usr/local/mysql
export PATH=${MYSQL_HOME}/bin:$PATH
使修改的配置文件生效:source /etc/profile
这一块:我执行时提示找不到source命令,第一点使用root用户,其次嘞,你要把你添加的配置内容整立正的,弄对齐了,格式要严谨!!! python 亦如此
可以不帅,但是要立正! ^_^!
4)查看mysql实例状态:mysqld_multi report; 如果显示三个实例都not running 启动各个实例: sudo mysqld_multi start
启动成功后,再擼一遍查看状态:mysqld_multi report; 这一次全部显示 running
看下端口占用(严谨给你我他都会带来安全感!)
sudo ss -tulpn|grep mysqld
5)连接各个实例 修改密码:
a.sudo mysql -S /tmp/mysql.sock1 -p‘上面说到的初始密码’
b.进去后修改root密码: set password=password('123456');
c.更改root用户的host属性 update mysql.user set host = '%' where user ='root;
d. 使修改生效:flush privileges;
授权
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;
其中,root 是用户名,% 表示所有人都可以访问,123456是我的登陆实例的密码,到这大致就完成了。再细化下小细节.
6)小细节:
如果你想停掉某个实例:
mysqladmin -uroot -p'123456' -S /tmp/mysql.sock3 shutdown
-u 用户 -p密码 然后跟着节点的sock信息 执行一下,喀嚓一下就停掉了。
mysqld_multi report; 再查看以下 节点3 not running 了
还有配置 主从,我这里是3306是主 3307,3308 从 我说的是端口哈。
我是杂配置的呢 look:
change master to
master_host='127.0.0.1',
master_port=3306,
master_user='root',
master_password='123456',
master_log_file='mysql-bin.000005',
master_log_pos=154;
master_log_file 配置这块的参数 可以在从节点查看 主节点信息,口令:show master status\G;
执行 start slave; show slave status\G; 查看信息,注意的是俩个变量属性, Slave_IO_Running 和 Slave_SQL_Running 正确的话都是YES
最后呢,开起各个从节点, start slave; 然后登陆主节点: 我的3306是主节点,
mysql -S /tmp/mysql.sock1 -p'123456'
show databases;
在主节点新建个空库,导入数据看俩个从节点是否也有新建的库,
create database pairsdb ;
use pairsdb;
set names utf8;
source/opt/tools/paris.sql;
等待结束后,进入各个从节点查看是否包含新导入的库,或者你也可以在主节点新建个库
create database abcDB;
create table t1 (id int,name varchar(200),createtime timestamp,key(id));
insert into t1 values (1,'aa',now());
insert into t1 values (3,'bb',now());
执行完上述操作后,切换到Salve从节点看看是否同步过去,不出意外的话,应该是会马上同步过去的。
遇到的小阻碍:
我更新abcdb 表中的字段时 主变,其中一个从节点没变;我查看了下 没变的那个节点的: show slave status\G;
发现 Slave_SQL_Running 为false 就是为NO,怪不得呢,没病不死人,光然有鬼。
解决办法:
stop slave;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;
start slave;
show slave status\G;
邮箱:yzydevops@163.com