数据库拆分原则
1.优先使用缓存来降低数据库访问压力
2.缓存无法解决问题使用数据库读写分离
3.读写分离有瓶颈使用数据库业务垂直拆分,将不同业务数据分到不同库中
4.单表数据量过大使用数据库水平拆分,尽量控制每个表的数据量在1000万条内,可以使用取模等算法到相应数据库中找数据
运用场景
1.当数据库查询操作频繁地时候,为了减少库的压力将其划分为主库和从库集群,将访问压力平摊到各个库上。
2.在查询的时候往往要建立索引增加查询效率,但每次插入数据需要更新索引会影响数据库写入速度,所以进行读写划分可以减少主库索引提升写入效率的同事提高查询速度。
3.但读写分离只能减少访问压力,当数据量暴增时数据库的查询速度还是很慢,这时候就需要考虑分库分表了。
4.在写入多的情景下,不适用这种情况,因为压力还是在主库上
5.主库和从库之间数据的同步有一定延迟,可以在从库找不到时从主库找,或者使用延时
6.尽量不使用分布式事务,有事务的数据尽量都放在同一个库中
准备工作:安装并配置centos
1.采用国内的阿里云地址下载速度快http://mirrors.aliyun.com/centos/7/isos/x86_64/
2.虚拟机中安装系统
参考博客https://blog.csdn.net/babyxue/article/details/80970526
这里网络连接使用桥接模式,让虚拟机与主机的网络相互独立
3.虚拟机网络配置
由于centos默认不开启网卡,所以需要修改配置文件,让其启动。
参考博客https://blog.csdn.net/jcxch/article/details/48632761
4.配置超级用户权限
用户若没有sudo权限无法执行yum安装操作,配置过程参考
https://blog.csdn.net/u010865136/article/details/78062193
至此虚拟机安装成功,两台虚拟机安装过程一样,下面开始安装mysql服务。
一、分别给两台服务器安装mysql(参考https://blog.csdn.net/a774630093/article/details/79270080)
1.检查系统是否装有mysql
rpm -qa | grep mysql
2.若返回空值,说明没安装mysql,需要自己安装
yum install mysql
3.下载mysql的repo源
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
4.安装mysql-community-release-el7-5.noarch.rpm包
sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
问题:wget command not found
解决:
yum -y install wget
5.安装mysql
sudo yum install mysql-server
6.重置密码
mysql -uroot
问题:ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2),原因是/var/lib/mysql的访问权限问题。下面的命令把/var/lib/mysql的拥有者改为当前用户:
chown root /var/lib/mysql/
7.重启服务
service mysqld restart
8.重置登录密码
mysql -u root -p
mysql > use mysql;
mysql > update user set password=password('123456') where user='root';
mysql > exit;
9.加入远程连接能力,用户名为root,密码为:123456
mysql> GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "123456";
10.查询数据库编码格式为utf-8
show variables like "%char%";
如此导入数据库sql时要确保sql文件为utf8编码,进入mysql输入如下命令:
set names utf8;
二、修改防火墙让端口可让外部连接
1.开放端口让外部可连接
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
2.Navicat连接数据库
三、修改数据库配置文件,配置数据库主从复制(参考:https://www.cnblogs.com/zuge/p/6395369.html
)
1.分别进入两台服务器配置,进入配置文件,修改文件内容如下(两台server-id设置不同):
sudo vi /etc/my.cnf
2.重启mysql服务
service mysql restart
3.查看配置文件是否生效,看server_id是否相同
show variables like 'server_id';
4.查看master信息
show master status;
记录下file及position值,后面进行从服务器操作时要用到
5.配置从服务器,进入mysql后执行如下命令:
change master to
master _host='#主库地址'
master_user='root',
master_password='#用户密码',
master_log_file='#主库file值',
master_log_pos=#主库position值;
6.启动slave同步功能
start slave;
7.查看slave状态
show slave status\G
其中Slave_IO_Running与Slave_SQL_Running值都为yes,表明状态正常。
8.测试主从复制
1.主库上创建test数据库,从库中也增加此库
四、用mysql-proxy配置读写分离
场景描述:
数据库master主服务器:10.112.94.135
数据库slave从服务器:10.112.92.143
mysql-proxy代理服务器:192.168.19.1
以下操作是在mysql-proxy中执行的。
1.在window中安装mysql-proxy,下载地址:https://downloads.mysql.com/archives/proxy/
安装后目录如下:
2.在bin问价夹下创建mysql-proxy.conf文件,内容如下:
[mysql-proxy]
admin-username=root
admin-password=123456
admin-lua-script=#mysql-proxy安装目录/lib/mysql-proxy/lua/admin.lua
proxy-backend-addresses=10.112.94.135:3306
proxy-read-only-backend-addresses=10.112.92.143:3306
proxy-lua-script=#mysql-proxy安装目录/share/doc/mysql-proxy/rw-splitting.lua
log-file=#mysql-proxy安装目录/log/mysql-proxy.log
log-level=debug
daemon=true
keepalive=true
这里要保证目录下每个文件夹都存在否则有可能运行出错
内容含义:
admin-username:用于中间件连接的用户,这里我还是用root偷懒
admin-password:同上用户密码
admin-lua-script:根据存放的文件位置自行调整
proxy-backend-addresses:主库服务器+端口
proxy-read-only-backend-addresses:从库服务器+端口,多个从库用,隔开
proxy-lua-script:根据存放的文件位置自行调整
log-file:日志文件存放位置,如果你指定了一个路径,请确保手动创建了对应的文件夹,否则会报错
log-level:日志级别
daemon:以守护进程方式运行
keepalive:长连接
3.在安装文件的bin目录下创建文件install.bat,内容如下:
"#mysql-proxy安装目录/bin/mysql-proxy.exe" -P #代理服务器IP地址:6217 --defaults-file="#mysql-proxy安装目录/bin/mysql-proxy.conf"
6217端口可以自己指定,用于连接的时候使用
4.接下来,用你的客户端工具连接 192.168.19.1:6217
遇到的问题及解决办法:
本机网络不可用
解决:vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改:ONBOOT=no为ONBOOT=yes
重启:sudo service network restart
文件为只读
解决:将文件用:wq!保存
用户无法进入sudo 模式
解决:进入root模式修改 /etc/sudoers文件在"root ALL=(ALL) ALL"下加上“用户名 ALL=(ALL) ALL”
mkdir命令不可用
解决:添加完超级用户(具备超级管理员权限的用户)后用sudo获得超级管理员权限
参考资料
https://blog.csdn.net/babyxue/article/details/80970526
https://blog.csdn.net/jcxch/article/details/48632761
https://blog.csdn.net/u010865136/article/details/78062193
https://blog.csdn.net/a774630093/article/details/79270080
https://www.cnblogs.com/zuge/p/6395369.html