一、首先我们在linux下(centOS7)安装好mysql5.7版本,方法有几种,这里使用安装离线rpm包方式,感觉这种方式最简单快捷。
(1)wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
(2)rpm -ivh mysql57-community-release-el7-8.noarch.rpm
(3)yum install mysql-server
安装完成之后我们就可以通过命令查看当前mysql的版本。
(4)
因为5.7版本默认有一个随机密码,可以通过grep “password” /var/log/mysqld.log
root@localhost后面的为密码。
(5)然后运行 mysql -uroot -p 回车
再粘贴我们刚复制的密码就可以进入数据库。
但是默认的随机密码是没办法对数据库做操作的,需要修改密码。而且5.7版本用了validate_password密码加强插件,所以123456这种密码就不能设置了。
我们可以通过降低数据库安全策略,去修改密码至123456.
登录到mysql客户端执行如下两条命令:
set global validate_password_length=1;
set global validate_password_policy=0;
set password for root@localhost=password(‘123456’);
(6)默认情况下其他服务器的客户端不能直接访问mysql服务端,需要对ip授权
GRANT ALL PRIVILEGES ON.TO 'root@'IDENTIFIED BY ‘root’ WITH GRANT OPTION;
二、(1)为什么会需要分库分表
1.超大容量问题。
2.操作性能问题。
(2)如何分库分表
1 垂直切分、水平切分
(a)垂直分库:解决了表过多的问题
(b)垂直分表:解决单表列过多的问题
水平切分:数据量大的表切成了很多个小表
常见的拆分策略:
垂直拆分(er分片(就是有关联的表放在一个数据库,以避免join的麻烦))
水平拆分:
可以利用一致性hash(但是扩容很麻烦)
可以按照范围拆分 比如ID 0-10000 10001-20000 等等
也可以按日期拆分
拆分后可以带来的问题:
1.跨库join的问题:
a 设计的时候就应该考虑到应用层的join问题
b 在服务层去做业务调用:
A B 两个表
先在B表里面查询需要得到数据 再根据关联的字段去查A表
如果查询到的是list 可以直接利用list查询 in 关键字 节省开销 提高性能
c 全局表(可以利用数据库设计个所有业务可能使用的全局表)
1.数据变更比较少
d 做字段冗余(空间换时间)
假设两张表 订单表 订单表里面有商家表的id字段,但是大多数我们需要的是商家名称
所以我们可以在订单表加个商家名称字段(冗余字段)
这就是反三范式的使用,很多时候也是很有效果的
但是也有一个问题商家名称可能会改变,但是订单表存的是存死的数据 当时查的名称存进来。
我们可以利用消息中间件 商家名称变更就通知
也可以定时任务、任务通知
唯一主键问题:
1、用自增id做主键
2、UUID (太长了,还有字母,性能比较低)、
3、snowflake
4、mongoDB
5、zookeeper
6、数据库表
其实分库分表最难的还是在于业务的复杂度。特别是已经存在大量的业务数据,而且这个业务数据已经渗透到了各个应用节点。
当前数据单表超过1000W、并且每天的增长量持续上升,就应该考虑是否需要优化分库分表等操作。
Mysql的主从配置:
数据库版本5.7,centos7环境:
安装之后文件对应的目录:
mysql的数据文件和二进制文件:/var/lib/mysql/
mysql的配置文件:/etc/my.cnf
mysql的日志文件:/var/log/mysql.log
详细配置步骤:
首先在master上面创建一个用户’repl’,并且允许其他服务器可以通过该用户远程访问master,再通过该用户去读取二进制文件,实现数据同步。
create user repl identified by ‘repl’;
而且该用户必须具有replication slave的权限,其他的权限都不用。
GRANT REPLICATION SLAVE ON . TO ‘repl’@’%’ IDENTIFIED BY ‘repl’ ;
然后我们就去master的配置文件修改配置:
第一个参数是开启二进制日志文件
第二个是服务器唯一标识
然后重启数据库: systemctl restart mysqld 查看master的状态信息
登录mysql通过 show master status 就可以看到当前master服务器生成的二进制文件名称
同理 slave的配置文件也需要修改:
relay-log是配置中继日志的,保存的是master同步过来的信息。
修改了配置文件之后也是重启数据库:systemctl restart mysqld
通过命令建立同步连接:
change master to master_host=‘192.168.1.7’,master_port=3306,master_user=‘repl’,master_password=‘repl’,master_log_file=‘mysql-bin.000001’,master_log_pos=154;
解释一下对应的参数:192.168.1.7是我master机器的ip 3306是数据库默认的端口,user password 是我们建立master的时候配置的用户名和密码
file和pos 是通过 master 机器 命令 show master status;
再执行start slave启动服务;可以通过 show slave status\G;
当你看到Slave_IO_Running:yes 和slave_sql_running:yes 这两个工作线程是yes说明主从配置是正常开启的。可以利用windows的native 和 sqlyong 连接到两个数据库,在master建立数据库或者建立表或者插入数据,再去slave数据库查看是否正常同步。
如果连接不上mysql大概是因为mysql没有开启远程调用,我们可以在服务器开启:
1、user mysql (切换数据库)
2、 update user set host=’%’ where user=‘root’;
3、 flush privileges;
当我们在master服务器创建了一个数据库,slave一会就同步拥有了此数据库。说明配置成功。