系统架构的演进和MySQL的主从配置
系统架构的演进和MySQL的主从配置
一. 系统架构的演进
1.1 项目开发时的系统结构
特点:各个组件基本都使用最基础功能,组件一般会选择轻量级的。测试时一般没有进行压力测试。
缺点:没有经历过真实环境的测试,上线后会出现各种问题。
如果在阿里云上部署,通过简单的代码调优,能够支撑小型公司的几十用户的使用。
1.2 服务器级别上的基本演进
如果用户数量上升,优化服务器的配置。
特点:还是使用一台服务器主机。从性能上来说并没有太大的提升。但是从tomcat接收用户的请求压力来说,用多个tomcat组成集群能够适当的多处理一些请求的并发。
缺点:tomcat的session共享问题。每一个tomcat需要处理所有的业务。
1.3 从数据库层面的演进
特点:使用多个数据库架构成主从的结构,能够实现读写分离,以减轻数据库的压力从而提高整个系统的性能。
缺点:主从数据同步有时间限制,所以可能会出现脏读等。
注意:一般情况下,如果真的需要优化,会同时实现web服务器的负载和数据库的读写分离。
1.4 从硬件上解决问题的瓶颈
如果用户并发数量继续上升,那么可以从提升硬件性能上来解决问题。但硬件也是有瓶颈的。
从web服务器来说,可以采用组件化,服务化的方式去优化。从数据库层面来说,可以采用分库分表的方式去优化。
二. MySQL的主从配置
原理:
从库生成两个线程,一个I/O线程,一个SQL线程; i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中; 主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog; SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
注意:主机和从机都应该先把需要同步数据的数据库创建好(名称和字符集要一致),因为主从配置只会同步数据(表和记录),不会自己创建数据库。
2.1 设置数据表名忽略大小写
使用vim打开 /etc/mysql/mysql.conf.d/mysqld.cnf 在[mysqld]下方添加一行: lower_case_table_names=1
2.2 配置MySQL允许外部访问
2.2.1 配置安全组规则(防火墙)
腾讯云: 1、设置主数据库外网访问权限。 a、设置3306端口外部访问权限。(修改/etc/mysql/mysql/mysql.conf.d/文件夹中的mysqld.cnf文件, 将bind_address的值由'127.0.0.1'改成你腾讯云内网IP地址) b、重启mysql服务器,然后输入netstat -anpt|grep 3306检查3306端口是否显示腾讯云的内网IP 2、阿里云 修改主机/etc/mysql/mysql.cnf.d/mysqld.cnf文件,将bind_address注释掉 添加安全组规则: 入方向: 协议类型选择My SQL 授权类型改为地址段访问 授权对象输入:0.0.0.0/0
2.2.2 创建一个用户,并授予外部访问权限
1.创建一个新用户用来远程连接使用: a、命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, 如果想让该用户可以从任意远程主机登陆,可以使用通配符%. password - 该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器. 例如此处:create user 'abc'@'%' IDENTIFIED BY '123456' b,授权: 命令:GRANT [privileges] ON databasename.tablename TO 'username'@'host' 说明: privileges - 用户的操作权限,如SELECT , INSERT , UPDATE 等(详细列表见该文最后面).如果要授予所的权限则使用ALL.;databasename - 数据库名,tablename-表名,如果要授予该用户对所有数据库和表的相应操作权限则可用*表示, 如*.*. 例子: GRANT SELECT, INSERT ON test.user TO 'pig'@'%'; GRANT ALL ON *.* TO 'abc'@'%'; 注意:用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,用以下命令: GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION; 例如此处:GRANT ALL ON yy_test.* TO 'abc'@'%';
2.3 设置MySQL主机
1.修改MySQL配置文件 sudo vi /etc/mysql.conf.d/mysqld.cnf 在[mysqld]模块中添加以下配置(默认是被注释掉的) server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_do_db = yy_test binlog_ignore_db = mysql c、授予从机复制表权限 GRANT REPLICATION SLAVE ON *.* TO 'user'@'X.X.X.X' IDENTIFIED BY 'password'; 例如此处:GRANT REPLICATION SLAVE ON *.* TO 'abc'@'%' IDENTIFIED BY '123456'; 2.重启服务器MySQL,命令: sudo /etc/init.d/mysql restart 3.登录Mysql,执行 如下sql mysql>show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 154 | yy_test | mysql | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) 注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化 记录 File 和 Position的值;
2.3 设置MySQL从机
1.修改MySQL配置文件 sudo vi /etc/mysql.conf.d/mysqld.cnf 在[mysqld]中添加: server-id = 2 relay-log = slave-relay-bin relay-log-index = slave-relay-bin.index 2.重启Slave从服务器MySQL,命令: sudo /etc/init.d/mysql restart 3.登录Slave从服务器,连接Master主服务器 输入以下命令: change master to master_host='47.93.193.110',master_port=3306,master_user='abc',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154; 备注:master_host对应主服务器的外网IP地址,master_port对应主服务器的端口(3306),master_log_file对应show master status显示的File列:mysql-bin.000001,master_log_pos对应Position列:154,否则有可能出现同步失败。 4. 重启mysql服务器。 5.登录MySQL状态下,启动Slave数据同步。 start slave;