文章目录
简介
什么是数据库读写分离
读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
为什么要搞数据库读写分离
在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。
配置主从同步的基本步骤
有很多种配置主从同步的方法,可以总结为如下的步骤:
- 在主服务器上,必须开启二进制日志机制和配置一个独立的ID
- 在每一个从服务器上,配置一个唯一的ID,创建一个用来专门复制主服务器数据的账号
- 在开始复制进程前,在主服务器上记录二进制文件的位置信息
- 如果在开始复制之前,数据库中已经有数据,就必须先创建一个数据快照(可以使用mysqldump导出数据库,或者直接复制数据文件)
- 配置从服务器要连接的主服务器的IP地址和登陆授权,二进制日志文件名和位置
实践阶段
测试环境
Mysql5.7.29主服务器:ubuntu16
Mysql5.7.29从服务器:ubuntu16上的docker容器
WEB框架:Django1.8
docker容器安装(若在不同服务器搭建数据库,此步可省略)
docker三个核心概念: Repository(仓库) -> Image(镜像) -> Container(容器)
卸载可能存在的旧版本
sudo apt-get remove docker docker-engine docker-ce docker.io
更新apt包
sudo apt-get update
安装以下包以使apt可以通过HTTPS使用存储库(repository):
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
添加GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
设置stable存储库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
再次更新apt包
sudo apt-get update
安装最新版本的Docker CE(社区免费版)
sudo apt-get install -y docker-ce
验证docker: sudo docker version 或 sudo docker info
查看docker服务是否启动
systemctl status docker
经典的hello world
运行docker命令时需要root权限或者加sudo
sudo docker pull hello-world拉取dockerHub上的hello-world镜像
sudo docker images查看镜像信息
可以看到已存在hello-world镜像
**字段解释**
REPOSITORY: 来自于哪个仓库;
TAG: 镜像的标签信息,比如 5.7、latest 表示不同的版本信息;
IMAGE ID: 镜像的 ID, 如果您看到两个 ID 完全相同,那么实际上,它们指向的是同一个镜像,只是标签名称不同罢了;
CREATED: 镜像最后的更新时间;
SIZE: 镜像的大小,优秀的镜像一般体积都比较小
生成该镜像的实例容器(镜像与容器的关系就像类和实例类对象)
sudo docker run hello-world
有以上输出,表示docker安装成功.
Docker服务相关命令
开启Docker服务
systemctl start docker
停止Docker服务
systemctl stop docker
重启Docker服务
systemctl restart docker
开机自启Docker服务
systemctl enable docker
创建mysql容器
家目录下创建mysql_slave目录作为容器挂载数据卷
mkdir mysql_slave
进入mysql_slave目录
cd mysql_slave
创建data目录
mkdir data
将宿主机的mysql配置文件目录拷到当前数据卷目录下
cp -a /etc/mysql/mysql.conf.d ./
将配置文件拷贝过来后,编辑mysql.conf.d目录下的mysqld.cnf 文件
宿主机中的mysql做为主服务器,其server-id设为1,从服务器只要不是1都行,这边取2
server-id = 2
创建容器(如果没有该镜像,则自动从dockerHub拉取该镜像并创建容器)
docker run -id
-p 3308:3306
–name=mysql-slave
-e MYSQL_ROOT_PASSWORD=mysql
-v /root/mysql_slave/data:/var/lib/mysql
-v /root/mysql_slave/mysql.conf.d:/etc/mysql/mysql.conf.d
mysql:5.7.29
参数解释:
-p 指定映射的端口,左边为宿主机端口,右边为容器端口,这样就可以通过映射的3308端口在宿主机以外的外部机器访问该容器中的mysql
-id 表示该容器作为守护进程在后台运行,创建后马上运行,但是不会进入shell终端,退出后也不会真正退出
–name 指定实例容器的名称
-e 指定数据库密码
-v 指定要挂载的目录或文件,必须写绝对路径,左边为宿主机路径,右边为容器路径
mysql:5.7.29 指