mysql多实例双主部署
本文引自公司技术文档,仅作为记录。
背景
有的时候需要进行数据库环境的隔离,以及节省服务器资源
一台mysql安装多个数据库实例,一个实例下构建多个数据库
安装mysql
yum -y install ncurses-devel cmake wget gcc gcc-c++ &&
cd /usr/local/src &&
wget http://192.168.1.173:8000/mysql-5.6.23.tar.gz &&
groupadd mysql && useradd mysql -g mysql
在mysql解压包目录下,执行如下编译安装脚本:
cd /usr/local/src &&
rm -rf mysql-5.6.23 &&
tar -zxvf mysql-5.6.23.tar.gz && cd mysql-5.6.23 &&
rm -rf /etc/my.cnf /usr/local/mysql &&
mkdir -p /usr/local/mysql /usr/local/mysql/mysql_data &&
rm -rf CMakeCache.txt &&
cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/mysql_data \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_DEBUG=1 &&
make -j `cat /proc/cpuinfo |grep processor|wc -l` && make install &&
cp /usr/local/mysql/support-files/mysql.server \
/etc/init.d/mysqld &&
chkconfig mysqld --level 35 on
ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
ln -s /usr/local/mysql/bin/mysqladmin /usr/local/bin/mysqladmin
ln -s /usr/local/mysql/bin/mysqld_multi /usr/local/bin/mysqld_multi
ln -s /usr/local/mysql/bin/my_print_defaults /usr/local/bin/my_print_defaults
wget http://192.168.1.173:8000/my.cnf -O /usr/local/mysql/my.cnf
ln -s /usr/local/mysql/my.cnf /etc/my.cnf
mkdir -p /data0/mysql /data1/mysql /data2/mysql
chown mysql.mysql /etc/init.d/mysqld /data0/mysql /data1/mysql /data1/mysql &&
chmod u+x /etc/init.d/mysqld &&
chown -R mysql.mysql /usr/local/mysql/
初始化实例
rm -rf /data1/mysql/data3306/*
/usr/local/mysql/scripts/mysql_install_db \
--basedir=/usr/local/mysql \
--datadir=/data1/mysql/data3306
rm -rf /data1/mysql/data3307/*
/usr/local/mysql/scripts/mysql_install_db \
--basedir=/usr/local/mysql \
--datadir=/data1/mysql/data3307
rm -rf /data1/mysql/data3308/*
/usr/local/mysql/scripts/mysql_install_db \
--basedir=/usr/local/mysql \
--datadir=/data1/mysql/data3308
mkdir -p /data1/mysql/{log3308,log3308,log3308}
mkdir -p /data0/log-bin/{log3308,log3308,log3308}
mkdir -p /usr/local/mysql/tmp
chown -R mysql.mysql \
/data0/mysql \
/data1/mysql \
/data0/log-bin \
/usr/local/mysql/
修改配置文件
多实例的主配置文件也只有一个:
vim /usr/local/mysql/my.cnf
确认如下内容:
# para for mysql
# author : thy
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
user = mysql
[mysqld3306]
[mysqld3307]
[mysqld3308]
basedir = /usr/local/mysql/
datadir = /data1/mysql/data3308
socket = /data1/mysql/data3308/mysql.sock
pid-file = /data1/mysql/data3308/mysqld.pid
tmpdir=/tmp
lc_messages_dir=/usr/local/mysql/share
log-error = /data1/mysql/log3308/error.log
general_log_file=/data1/mysql/log3308/general.log
slow_query_log = 2
slow_query_log_file = /data1/mysql/log3308/slow.log
log_bin_trust_function_creators=1
user = mysql
port = 3308
#binlog path
log-bin=/data0/log-bin/log3308/mysql-bin
server_id=2083308
binlog_cache_size=32K
max_binlog_cache_size=2G
max_binlog_size=500M
binlog-format=ROW
sync_binlog=1000
log-slave-updates=1
expire_logs_days=0
master-info-file=/data1/mysql/log3308/master.info
relay-log=/data1/mysql/log3308/relaylog
relay_log_info_file=/data1/mysql/log3308/relay-log.info
relay-log-index=/data1/mysql/log3308/mysqld-relay-bin.index
slave_load_tmpdir=/usr/local/mysql/tmp
slave_type_conversions="ALL_NON_LOSSY"
slave_net_timeout=4
skip-slave-start
sync_master_info=1000
sync_relay_log_info=1000
skip_external_locking
key_buffer_size = 256M
max_allowed_packet = 128M
thread_stack = 512K
table_open_cache = 5120
sort_buffer_size = 6M
read_buffer_size = 4M
join_buffer_size = 8M
myisam_sort_buffer_size = 128M
thread_cache_size = 64
query_cache_size = 128M
tmp_table_size = 256M
back_log = 500
max_connections = 1000
max_connect_errors = 10000000
thread_concurrency = 8
explicit_defaults_for_timestamp = TRUE
event_scheduler=on
interactive_timeout=288000
wait_timeout=288000
lock_wait_timeout=30
concurrent_insert=2
#server
default-storage-engine=MyIsam
default-tmp-storage-engine=MyIsam
character-set-server=utf8
lower_case_table_names=1
skip-external-locking
open_files_limit=655360
safe-user-create
local-infile=1
#sqlmod="STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE"
performance_schema=0
skip-name-resolve
skip-ssl
connect_timeout=8
net_read_timeout=30
net_write_timeout=60
启动多实例
mysqld_multi --defaults-extra-file=/usr/local/mysql/my.cnf report
mysqld_multi \
--defaults-extra-file=/usr/local/mysql/my.cnf \
--log=/usr/local/mysql/mysqld3306.log \
start 3306
mysqld_multi \
--defaults-extra-file=/usr/local/mysql/my.cnf \
--log=/usr/local/mysql/mysqld3307.log \
start 3307
mysqld_multi \
--defaults-extra-file=/usr/local/mysql/my.cnf \
--log=/usr/local/mysql/mysqld3308.log \
start 3308
查看是否启动成功:
ps -ef |grep mysql
netstat -antp |grep LIST|grep mysql
关闭多实例
强行关闭全部mysql实例:
pkill mysql
mysqladmin -uroot -S /data1/mysql/data3306/mysql.sock shutdown
mysqladmin -uroot -S /data1/mysql/data3307/mysql.sock shutdown
mysqladmin -uroot -S /data1/mysql/data3308/mysql.sock shutdown
强行关闭多实例
netstat -antp |grep LIST|grep 3306 |awk '{printf $NF}'|awk -F / '{print $1}'|xargs -t -i kill -9 {}
netstat -antp |grep LIST|grep 3307 |awk '{printf $NF}'|awk -F / '{print $1}'|xargs -t -i kill -9 {}
netstat -antp |grep LIST|grep 3308 |awk '{printf $NF}'|awk -F / '{print $1}'|xargs -t -i kill -9 {}
netstat -antp |grep LIST|grep mysql
cat /data0/mysql/data3306/error.log
cat /data0/mysql/data3307/error.log
cat /data0/mysql/data3308/error.log
登录多实例
mysql -uroot -S /data1/mysql/data3306/mysql.sock
mysql -uroot -S /data1/mysql/data3307/mysql.sock
mysql -uroot -S /data1/mysql/data3308/mysql.sock
初始化账号
select * from mysql.user;
delete from mysql.user where user='';
update mysql.user set host='%' where host='dcmysql1' and user='root';
update mysql.user set host='%' where host='dcserver2' and user='root';
update mysql.user set host='%' where host='mysql9' and user='root';
update mysql.user set host='%' where host='mysql10' and user='root';
update mysql.user set password=Password('password') where user='root' and host='%';
flush privileges;
配置双主环境
1、先分别情况两个实例的主从同步配置
reset master;
stop slave;
reset slave;
show master status \G
执行后,binlog目录会清空,只剩下两个文件:mysql-bin.000001和mysql-bin.index
并且两个实例的master状态都是:
show master status \G
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 120
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
2、配置my.cnf
分别在两个实例上添加如下配置,注意server-id必须不同,其他参数相同:
在实例1上配置:
vim /usr/local/mysql/my.cnf
添加如下内容:
server-id=10001
log-bin=mysql-bin
innodb_flush_log_at_trx_commit=1
sync_binlog=1
log-slave-updates
binlog-ignore-db=mysql,test
replicate-ignore-db=test,mysql,information_schema
#replicate-do-db = dataeye1
#replicate-do-db = dataeye2
#replicate-do-table = table1
#replicate-do-table = table2
在实例2上配置:
vim /usr/local/mysql/my.cnf
添加如下内容:
server-id=10002
log-bin=mysql-bin
innodb_flush_log_at_trx_commit=1
sync_binlog=1
log-slave-updates
binlog-ignore-db=mysql,test
replicate-ignore-db=test,mysql,information_schema
#replicate-do-db = dataeye1
#replicate-do-db = dataeye2
#replicate-do-table = table1
#replicate-do-table = table2
3、创建同步账号并重置master
分别在两个实例上创建同步账号并重置master信息:
GRANT REPLICATION SLAVE ON *.* TO 'master'@'%' IDENTIFIED BY 'master';
flush privileges;
stop slave;
reset master;
flush tables with read lock;
注意:
必须先在两个实例都创建了同步账号,停用了slave,重置master信息以后,
才执行CHANGE MASTER操作。
如果连着操作就会出现一个问题:
节点1作为从节点,能正常同步节点2的数据,
但是节点2做为从节点不能同步节点1的数据。
### 4、配置节点1
登录实例1,执行如下sql(注意节点2的配置跟1有关):
CHANGE MASTER TO MASTER_HOST='192.168.1.141',\
MASTER_PORT=3306,\
MASTER_USER='master', \
MASTER_PASSWORD='master', \
MASTER_LOG_FILE='mysql-bin.000001', \
MASTER_LOG_POS=120;
unlock tables;
flush privileges;
start slave;
show slave status \G
show master status \G
结果如下:
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 199
注意:
执行如上sql后,节点1的Position会从120变为其他值,如199
5、配置节点2
根据1的master信息的Position,执行如下sql:
CHANGE MASTER TO MASTER_HOST='192.168.1.141',\
MASTER_PORT=3306,\
MASTER_USER='master', \
MASTER_PASSWORD='master', \
MASTER_LOG_FILE='mysql-bin.000001', \
MASTER_LOG_POS=199;
unlock tables;
flush privileges;
start slave;
show slave status \G
show master status \G
注意:
这里的MASTER_LOG_POS不是120了,必须是当前节点1的Position。
否则也会出现其中一个节点的同步问题:
节点1作为从节点,能正常同步节点2的数据,
但是节点2做为从节点不能同步节点1的数据。
常用命令
清空节点主从配置
reset master;
stop slave;
reset slave;
show master status \G
查看从节点状态:
show slave status \G
查看从节点IP:
show slave hosts \G
查看主节点状态:
show master status \G (更详细)
show master logs \G
查看节点server id
show variables like 'server_id' \G
show variables like 'server_uuid' \G
查看binlog变更日志
show binlog events;
查看同步进度和连接情况
show processlist;
查看其它全局参数
show variables like 'innodb_data_file_path' \G
show variables like 'innodb_force_recovery' \G
锁定所有表
flush tables with read lock;
锁定单个表
例如锁定表tables1不能读,只能写,
锁定表tables2可以读,不能写。
LOCK TABLES tables1 WRITE, table2 WRITE;
解锁所有表
unlock tables;
查看表状态:
use database1;
show table status;
常见问题
报错1
双主环境中,在主节点插入数据后,在从节点发现报错:
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'could not find next log; the first event 'mysql-bin.000001' at 4, the last event read from
'./mysql-bin.000002' at 399, the last byte read from './mysql-bin.000002' at 399.'
这是因为主主同步默认配置中的MASTER_LOG_FILE和MASTER_LOG_POS 指定了同步其实位置,但这个位置上不连续的,中间可能被清理过一次。
解决方法:
1、登录slave节点:
stop slave;
2、登录master节点:
flush logs;
show master status;
3、回到slave节点,根据master的节点位置重新指定同步位置并启动slave:
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=120;
start slave;
报错2
./error.log:101:2016-02-18 17:27:23 15334 [ERROR] Slave SQL:
Error 'Can't create database 'data22222222222222'; database exists' on query. Default database:
'data22222222222222'. Query: 'CREATE DATABASE `data22222222222222`', Error_code: 1007
解决:
vim /usr/local/mysql/my.cnf
添加如下一行:
slave-skip-errors=all
报错3
修复表报错:
Error: /usr/local/mysql/bin/mysqlcheck doesn't support
multiple contradicting commands.
表结构修复:
/usr/local/mysql/bin/mysqlcheck \
--defaults-extra-file=/usr/local/mysql/my.cnf \
-S /data0/mysql/data3308/mysql.sock \
-r --databases mysql
多实例修复数据库时不支持--optimize参数:
/usr/local/mysql/bin/mysqlcheck \
--auto-repair \
--check --optimize \
--all-databases
mysql多实例双主部署的更多相关文章
- Mysql + keepalived 实现双主热备读写分离【转】
Mysql + keepalived 实现双主热备读写分离 2013年6月16日frankwong发表评论阅读评论 架构图 系统:CentOS6.4_X86_64软件版本:Mysql-5.6.12 ...
- centos 下 mysql+keepalived实现双主自由切换
目录 ip规划 mysql双主配置 keepalived配置 mysql1中keepalived的配置 mysql2中keepalived的配置 VIP漂移检测 本文的目的是搭建一个互为主从的mysq ...
- MySQL的主从复制+双主模式
MySQL的主从复制 部署环境: MySQL master 192.168.40.21 MySQL slave 192.168.40.22 思路: 当主MySQL上进行数据上的操作或者变化时,主My ...
- mysql主从复制及双主复制
之前做过一次在单台机器上的多实例的mysql,这次分开做,使用两台主机. 这里使用的主机地址分别为: MASTER:192.168.214.135 SLAVE : 192.168.214.128 这 ...
- MySQL 5.7双主同步部分表
参考:http://www.jb51.net/article/122892.htm?pc 前言: 我们要配置双主同步的mysql服务器. 暂时叫做,mysql1和mysql2吧. 一 mysql的配 ...
- MySQL 5.7 双主复制+keepalived,常规业务一般够用了
业务需求: 为Zabbix搭建2个数据库,一个库给服务器监控用,一个库给网络监控用. 硬件: 两台服务器,硬盘是1.2 T SSD卡,内存128G 架构: 希望做双主复制+keepalived,架构大 ...
- [Mysql高可用]——双主互备+keepalived
实验架构图 实验环境 主机名 操作系统 Mysql版本 keepalived版本 主机IP VIP lyj1(Master/Slave) Red Hat release 6.5 Mysql5.6 ...
- mysql 5.7 双主+主从配置
mysql5.7安装及赋权 wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm rpm -ivh mysql57 ...
- Mysql之配置双主热备+keeepalived.md
准备 1 1. 双主 master1 192.168.199.49 2 master2 192.168.199.50 3 VIP 192.168.199.52 //虚拟IP 4 2.环境 master ...
随机推荐
- JS清除空格之trim()方法
JQ: $.trim() 函数用于去除字符串两端的空白字符. 注意:$.trim()函数会移除字符串开始和末尾处的所有换行符,空格(包括连续的空格)和制表符.如果这些空白字符在字符串中间时,它们将被保 ...
- Django继承drf的user模型的demo
1.安装虚拟环境 #mkvirtualenv drfdemo -p python3 #pip install django #pip install djangorestframework #pip ...
- ThinkPHP6源码分析之应用初始化
ThinkPHP6 源码分析之应用初始化 官方群点击此处. App Construct 先来看看在 __construct 中做了什么,基本任何框架都会在这里做一些基本的操作,也就是从这里开始延伸出去 ...
- NSObject类的API介绍
这篇文章围绕的对象就是NSObject.h文件,对声明文件中的属性.方法进行必要的“翻译”. 该文件大致由两部分组成:NSObject协议和NSObject类. (一)NSObject协议 - (BO ...
- 对于使用javaweb技术制作简单管理系统的学习
近期在老师的引导下我们学习了利用Javaweb技术制作简单的管理系统,其中涉及到的技术很多,由于大多都是自学 对这些技术的理解还太浅显但能实现一些相关功能的雏形. (一).登录功能 在登陆功能中通过与 ...
- CentOS修改各大yum源(centos5,centos6,centos7)
备份原配置文件 进入yum源配置目录: cd /etc/yum.repos.d 如果没有先安装wget: sudo yum install wget 修改yum源,就是修改CentOS-Base.re ...
- PTA的Python练习题(八)
从 第3章-15 统计一行文本的单词个数 继续 1. s = input() count=0 for c in s: if c==' ': count=count+1 if c=='.': break ...
- Django中的prefetch_related()函数优化
对于多对多字段(ManyToManyField)和一对多字段, 可以使用prefetch_related()来进行优化 prefetch_related()和select_related()的设计目的 ...
- 十四 OGNL的概述
1 什么是OGNL? 对象图导航语言(对象图,以任意一个对象为根,通过OGNL;可以访问与这个对象关联的其他对象).比EL表达式强大很多倍. 可以存取对象的任意属性.调用对象的方法,遍历整个对象的结构 ...
- ES5-严格模式
在es5中可以开启一种严格模式的代码形式,开启方式是:将全局或者函数的第一条语句定义为:'use strict';. 如果浏览器不支持,会将其解析为一条普通语句,没有任何的副作用. 开启全局模式后会有 ...