说明
这篇文章主要面向实战,因为平时搭建mysql场景很少,包括主从搭建,等问题,所以在这里写一个工具集,方便后续使用,大家也可用参考。
注:这里采用docker部署,平时也一直用的docker,未来也是趋势,所以采用的docker
#opt目录是Linux提供我们扩展的目录,可以存放用户需求的文件 mkdir -p /opt/datas/docker/mysql/conf mkdir -p /opt/datas/docker/mysql/data
配置文件
vim /opt/datas/docker/mysql/conf/my.cnf 放下面这些
[client]
#socket = /usr/mysql/mysqld.sock
default-character-set = utf8mb4
[mysqld]
#pid-file = /var/run/mysqld/mysqld.pid
#socket = /var/run/mysqld/mysqld.sock
#datadir = /var/lib/mysql
#socket = /usr/mysql/mysqld.sock
#pid-file = /usr/mysql/mysqld.pid
lower_case_table_names=1
datadir = /opt/datas/docker/mysql/data
character_set_server = utf8mb4
collation_server = utf8mb4_bin
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Custom config should go here
!includedir /etc/mysql/conf.d/
run容器
docker run \
--name lhc_mysql \
--restart=unless-stopped \
-it -p 3306:3306 \
-v /opt/datas/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /opt/datas/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=<your password> \
-e lower_case_table_names=1 \
-d mysql:8.0
这两处是解决大小写敏感问题的地方
进入容器
docker exec -it 容器id /bin/bash;
mysql -uroot -p;
这里开放连接权限 use mysql ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '新密码'; flush privileges;
这里开放权限,让程序能连上,mysql8.0以后需要这样做,这就是标准的配置mysql8.0的过程。
先说一下,innoDB和myIsam的区别
最大的区别就是事物,innoDB支持事物,而myIsam不支持,另外只有innoDB支持外键
然后就是索引和锁的差异
innoDB是聚簇索引,myIsam是非聚簇索引 innoDB支持行锁,而innoDB只支持表锁,因此并发处理能力innoDB更好
并发处理能力方面,innoDB通过mvcc来达到高的并发
还有innoDB不支持全文索引和count(*)
最后就是数据文件的差异了
这个会取决于mysql的版本,这里着重说一下
注意,是对应持久化的路径,由于借用的云服务器,在这里不配置volume卷持久化,这里直接在docker中查看,
docker run -p 3307:3306 --name test_mysql_7 \
-e MYSQL_ROOT_PASSWORD=testmysql7 \
-d mysql:5.7
这里跑起来这个容器,1.5.7
再搞一个mysql8.0
docker run -p 3308:3306 --name test_mysql_8 \
-e MYSQL_ROOT_PASSWORD=testmysql8 \
-d mysql:8.0
这里搞两个不同引擎的表,分别放到两个节点里,他们统一放到test库里面
CREATE TABLE `in_user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
CREATE TABLE `my_user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
现在随便往里面先插入数据,四个表都插入
这是两个容器,
现在我们先进入5.7看下文件
可以看到,myslq5.7他们的表结构都是.frm文件,innoDB的.ibd文件存储着索引和数据信息
而myIsam的.MYI文件存储索引信息,.MYD文件存放数据data信息。
再来看mysql8.0
此时myIsam的表结构存储再.sdi文件中,而索引和数据文件仍然是MYI和MYD
而innoDB的索引和数据仍然是.idb文件,但是没有表结构的文件了
此时表结构存储在/var/lib/mysql/ibdata1 目录中,共享表空间,所有表的结构都在这里,
还有一个参数,
启用innodb_file_per_table选项时,InnoDB表会在磁盘上为每个表创建一个单独的.ibd文件来存储数据和索引
也就是我们看到的这个,默认是ON,若是关闭的话,我们连in_user.ibd都看不到了,都在这个文件里
这就是文件存储在两个引擎的差异。
这个主从搭建目的就是为了做读写分离使用,在mysql调优篇章里提到了软优化中,读写分离的问题,那么读写分离是建立在主从搭建问题上的,既然是搭建主从,先回顾一下主从复制的流程原理
主库中有binlog,记录数据的变动,log dump线程将binlog推送到salve的io线程,io线程写入到Relaylog中继日志,从库slave再通过
SQL线程重放到数据库中。
#opt目录是Linux提供我们扩展的目录,可以存放用户需求的文件
mkdir -p /opt/datas/docker/mysql/conf
mkdir -p /opt/datas/docker/mysql/data
配置文件
vim /opt/datas/docker/mysql/conf/my.cnf
修改配置文件
然run容器
docker run \
--name lhc_mysql \
--restart=unless-stopped \
-it -p 3306:3306 \
-v /opt/datas/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /opt/datas/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=<your password> \
-e lower_case_table_names=1 \
-d mysql:8.0
先回顾一下普通单节点的创建,我们目录格式是,/opt/datas/docker/mysql,持久化以及配置,发生再这里,而主从搭建,为了方便管理,
我们在这里也做了区分
#创建目录
mkdir -p /opt/datas/docker/master/mysql
mkdir -p /opt/datas/docker/slave/mysql
#创建配置文件
touch /opt/datas/docker/master/mysql/my.cnf
touch /opt/datas/docker/slave/mysql/my.cnf
#部署主节点
docker run \
--name test_master_mysql \
--restart=unless-stopped \
-it -p 3307:3306 \
-v /opt/datas/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /opt/datas/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=<your password> \
-e lower_case_table_names=1 \
-d mysql:8.0
#部署从节点
docker run \
--name test_slave_mysql \
--restart=unless-stopped \
-it -p 3308:3306 \
-v /opt/datas/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /opt/datas/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=<your password> \
-e lower_case_table_names=1 \
-d mysql:8.0
现在直接执行上面的
这里做的是端口的区分,真实企业的话,端口3306,ip修改就可以了,具体的操作是一样的
追加进去上面给的配置文件即可,
主节点
vim /opt/datas/docker/master/mysql/my.cnf
[mysqld]
# 开启 binlog, 可以不加,默认开启
log-bin=mysql-bin
# 选择 ROW 模式
binlog_format=row
#server_id不要和slaveId重复
server-id=1
从节点配置 vim /opt/datas/docker/slave/mysql/my.cnf
[mysqld]
# 开启 binlog, 可以不加,默认开启
log-bin=mysql-bin
# 选择 ROW 模式
binlog_format=row
#server_id不要和slaveId重复
server-id=2
这里是否会有疑问,就是原理讲,binlog是主库的,为啥从库也要配置,
答案是为了后续使用,有可能这个主库也是别人的从库!
这里说一下,是追加哈
下一步
重启服务
docker restart test_slave_mysql
docker restart test_master_mysql
现在两个节点配好了,那么如何知道怎么访问,访问权限,访问谁呢,
看下一步配置
给这个用户复制权限
进入主节点
docker exec -it test_master_mysql /bin/bash
mysql -uroot -p
-- 创建slave用户,这里%可以配置特定的ip,来实现白名单
CREATE USER 'joseph_canal'@'%';
-- 设置密码
ALTER USER 'joseph_canal'@'%' IDENTIFIED WITH mysql_native_password BY 'abc123456';
-- 授予复制权限
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'joseph_salve'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
确定主节点的binlog日志位置
去主节点执行
show master status\G
好,文件是这一个 mysql-bin.000004 position 是1095
从节点执行语句
change master to master_host='43.138.11.85', master_user='joseph_slave', master_password='123456789', master_port=3307, master_log_file='mysql-bin.000004', master_log_pos=1101, master_connect_retry=30;
开启主从同步
start slave;
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。