大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够。到了数据业务层、数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢失的话,后果更是不堪设想。这时候,我们会考虑如何减少数据库的联接,一方面采用优秀的代码框架,进行代码的优化,采用优秀的数据缓存技术如:memcached,如果资金丰厚的话,必然会想到假设服务器群,来分担主数据库的压力。今天总结一下利用MySQL主从配置,实现读写分离,减轻数据库压力.
这里我们一本地虚拟机为例来配置主从. mysql和mariadb是一样的配置的.我这里一mariadb为实际案例. 配置的时候两台虚拟机使用的是内网地址.
主机(Server1): 192.168.26.22 OS:CentOS 7.5
从机(Server1): 192.168.26.23 OS:CentOS 7.5
修改IP方式
vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改网络配置
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static # 修改
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=9f5b3186-f784-4857-8c4e-2b394a3d9672
DEVICE=ens33
ONBOOT=yes # 修改
GATEWAY=192.168.26.2 # Vmware 工具栏编辑项,选择虚拟网络编辑器,Nat 模式,单击 Nat 设置 获取网关 192.168.26.2
IPADDR=192.168.26.23 # 对外访问IP
NETMASK=255.255.255.0 # 一样
DNS1=192.168.26.2
按esc、组合键shrit + : ,wq 保存退出
重启网络
service network restart
至此,服务器已经搭建好了
主机创建 wtf 数据库 以及 user 表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`u_id` int(11) NOT NULL AUTO_INCREMENT,
`address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`apartment` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`create_time` datetime(0) NULL DEFAULT NULL,
`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`phone_number` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`role` int(11) NULL DEFAULT NULL,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`u_id`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 0 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
主机创建 wtf2 数据库 以及 user 表,SQL 同上
首先使用命令
cd /etc
然后在执行
ls my.cnf
在使用编辑器vi打开my.cnf文件
vi my.cnf 按 i 进入编辑模式
ESC :set number 打印行号
[root@localhost etc]# vi my.cnf
[mysqld]
1 [mysqld]
2 datadir=/var/lib/mysql
3 socket=/var/lib/mysql/mysql.sock
4 # Disabling symbolic-links is recommended to prevent assorted security risks
5 symbolic-links=0
6 # Settings user and group are ignored when systemd is used.
7 # If you need to run mysqld under a different user or group,
8 # customize your systemd unit file for mariadb according to the
9 # instructions in http://fedoraproject.org/wiki/Systemd
10
11 server-id=200
12
13 innodb_flush_log_at_trx_commit=2
14
15 sync_binlog=1
16
17 log-bin=mysql-bin-200
18
19 binlog-do-db=wtf
20
21 [mysqld_safe]
22 log-error=/var/log/mariadb/mariadb.log
23 pid-file=/var/run/mariadb/mariadb.pid
24
25 #
26 # include all files from the config directory
27 #
28 !includedir /etc/my.cnf.d
设置主服务 的ID (id可以自己随便设置但是要保证和slave的id不一样)
server-id=200
innodb_flush_log_at_trx_commit=2 #(参数的含义如下)
总结
设为1当然是最安全的,但性能页是最差的(相对其他两个参数而言,但不是不能接受)。如果对数据一致性和完整性要求不高,完全可以设为2,如果只最求性能,例如高并发写的日志服务器,设为0来获得更高性能
开启binlog 志同步功能
sync_binlog=1
binlog 日志文件名
log-bin=mysql-bin-200
这个表示只同步某个库 (如果没有此项,表示同步所有的库)
binlog-do-db=wtf
上面的配置写好之后按键盘ESC键在按shift+:输入wq.保存退出.
重启我们的主机数据库看自己的数据库是什么选用不同的命令
systemctl restart mysql
Docker 使用的是容器技术,其容器的配置与外界环境相隔离,按照 3.1 命令操作,其内部的Mysql Server_id 依然是 1,所以再进行主从配置配置时,报错… ,说的话比较抽象。大致可以理解为安装的 Docker 容器中有各自的配置环境,与操作系统环境相隔离。
安装详情见 linux 模块中的第三步,安装 Mysql 8.0.12。
这里在Linux 安装 3 个 Mysql 数据库,初始化密码为 root
192.168.26.22:3306 对外映射端口为 3306
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.12 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
192.168.26.23:3306 对外映射端口为 3306
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.12 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
192.168.26.23:3306 对外映射端口为 3307
docker run -p 3307:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.12 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
docker start mysql # 启动名称为 Mysql 的容器
docker exec -it mysql bash # 以 Bash 进入 Mysql 终端
apt-get update # 更新安装源
apt-get install vim # 安装 vim 命令,Docker 容器没有提供常见命令
vim /etc/mysql/my.cnf # 修改容器中的配置文件
192.168.26.22:3306 主数据库配置
server-id=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1
log-bin=mysql-bin-22-3306
192.168.26.22:3306 -> 3306 从数据库配置
server-id=2
innodb_flush_log_at_trx_commit=1
sync_binlog=1
log-bin=mysql-bin-23-3306
192.168.26.22:3306 -> 3307 从主数据库配置
server-id=3
innodb_flush_log_at_trx_commit=1
sync_binlog=1
log-bin=mysql-bin-23-3307
这里使用,mysql 为 docker Mysql 的容器名称,然后之前的操作
docker restart mysql
连续两次
exit 推出容器,或者重新连接一个 Shell 表
重启 mysql 容器
进入 Mysql 主数据库,进行账号授权,只有获取而二进制 log 日志权利
docker exec -it mysql bash
如果不是 docker 安装的 mysql 直接这一步
mysql -uroot -proot
说一下,登录密码依然是安装镜像的密码,真奇怪
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.12 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
再来给授权给从数据库服务 192.168.26.0-255,用户mark,密码158262751
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> CREATE USER 'mark'@'192.168.26.%' IDENTIFIED WITH mysql_native_password BY '158262751';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO 'mark'@'192.168.26.%';
Query OK, 0 rows affected, 1 warning (0.00 sec)
刷新授权表信息
mysql> flush privileges;
mysql> SHOW MASTER STATUS;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000005 | 4990 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
server-id=201
innodb_flush_log_at_trx_commit=2
sync_binlog=1
log-bin=mysql-bin-201
如果配置了同步的数据库,则在从机数据库上面要有一个和主机配置的数据库一样的数据库.
配置从机连接master
change master to master_host='192.168.26.22',master_user='mark' ,master_password='158262751', master_log_file='mysql-bin-22-3306.000001' ,master_log_pos=450;
参数说明:
开启主从,可以在Navicat 操作
start slave; # 开启主从
stop slave; # 关闭
reset slava; # 重置设置
show master status; # 显示主数据库 log 状态,主数据库查看
查看主从连接状态,可以在Navicat 操作
显示不明显
show slave status\G #
两个连接成功就说明成功了,主从数据库的数据库和表应该保持一致,不一致的话,会有错。
apt-get update
apt-get install vim
vim /etc/mysql/my.cnf
server-id=2
master-host=192.168.1.111
master-user=mstest
master-password=123456
master-port=3306
master-connect-retry=60