目录
首先我的主库选的是centos虚拟机,从库选的ubuntu虚拟机。如下图。
Sharding-JDBC(是一个可以轻松实现数据库读写分离的框架)


下面是我们需要进行的步骤。
首先我们用的是redis。
1.导入maven坐标
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-data-redisartifactId>
- dependency>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-cacheartifactId>
- dependency>
2.配置核心文件application.yml
- spring:
- cache:
- type: redis
- redis:
- time-to-live: 1800000 #设置缓存数据过期时间
3.在启动类上加@EnableCaching注解。然后我们进行对应缓存配置即可。
4.接下来我们举几个代码例子来说明每个注解的运用。
- /**
- * CachePut:将方法返回值放入缓存
- * value:缓存的名称,每个缓存名称下面可以有多个key
- * key:缓存的key
- */
- @CachePut(value = "userCache",key = "#user.id")
- @PostMapping
- public User save(User user){
- userService.save(user);
- return user;
- }
-
- /**
- * CacheEvict:清理指定缓存
- * value:缓存的名称,每个缓存名称下面可以有多个key
- * key:缓存的key
- */
- @CacheEvict(value = "userCache",key = "#p0")
- //@CacheEvict(value = "userCache",key = "#root.args[0]")
- //@CacheEvict(value = "userCache",key = "#id")
- @DeleteMapping("/{id}")
- public void delete(@PathVariable Long id){
- userService.removeById(id);
- }
-
- //@CacheEvict(value = "userCache",key = "#p0.id")
- //@CacheEvict(value = "userCache",key = "#user.id")
- //@CacheEvict(value = "userCache",key = "#root.args[0].id")
- @CacheEvict(value = "userCache",key = "#result.id")
- @PutMapping
- public User update(User user){
- userService.updateById(user);
- return user;
- }
-
- /**
- * Cacheable:在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
- * value:缓存的名称,每个缓存名称下面可以有多个key
- * key:缓存的key
- * condition:条件,满足条件时才缓存数据
- * unless:满足条件则不缓存
- */
- @Cacheable(value = "userCache",key = "#id",unless = "#result == null")
- @GetMapping("/{id}")
- public User getById(@PathVariable Long id){
- User user = userService.getById(id);
- return user;
- }
-
- @Cacheable(value = "userCache",key = "#user.id + '_' + #user.name")
- @GetMapping("/list")
- public List
list(User user){ - LambdaQueryWrapper
queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(user.getId() != null,User::getId,user.getId());
- queryWrapper.eq(user.getName() != null,User::getName,user.getName());
- List
list = userService.list(queryWrapper); - return list;
- }
注意:这里的参数key支持Spring的表达式语言SPEL语法。
result代表返回值,p0表示第一个参数,也可直接用参数名。

准备两台服务器,分别安装mysql并启动服务成功。


安装的前提我们已经卸载完成之前安装的mysql。
这里我就卸载了一次。
可以参考上面的内容,写的挺好的,实在不行就只能重新安装一次虚拟机。
- 下载
- wget http://repo.mysql.com/mysql80-community-release-el7-5.noarch.rpm
- 安装
- rpm -ivh mysql80-community-release-el7-5.noarch.rpm
- yum update
- yum install mysql-community-server
基本上我们就安装好了,接下来我们开始数据库的基本配置了。
- 启动mysql
- systemctl start mysqld.service
- mysql在安装后会创建一个root@locahost账户,并把初始密码放到了/var/log/mysqld.log;
-
- sudo cat /var/log/mysqld.log | grep password
-
- mysql -u root -p
- 然后输入我们上面获得的密码。
-
- 修改密码
- ALTER USER 'root'@'localhost' IDENTIFIED BY 'Password!';
- 然后我们这里应该会遇到不符合密码要求的情况。
- 这时候我们需要设置密码权限。
-
- 查看密码要求
- SHOW VARIABLES LIKE 'validate_password%';
-
- 更改密码最小长度要求为4
- set global validate_password_length=4;
- 设置密码等级为最低
- set global validate_password_policy=0;
-
-
我们还可能会用到的命令
- 进入mysql后
-
- 显示数据库列表
- show databases;
- 使用mysql数据库
- use mysql;
- 查询mysql的user表中的数据
- select * from user;
然后我们就可以配置主库了
1.首先修改下数据库配置文件my.cnf,centos的这个文件是在/etc/my.cnf
我们需要在[mysqld]下加上以下两行配置。
- log-bin=mysql-bin #启动二进制
- server-id=100 #唯一id
重启mysql服务
systemctl restart mysqld
登录到mysql,我们添加一个用户,并设置权限,这个到从库配置会用到。
- 用户创建:create user 'username'@'%' identified by 'password:';
-
- 授权:grant all privileges on *.* to 'username'@'%' with grant option;
-
- 查看用户权限:select host, user, authentication_string, plugin from user;
-
- 删除用户:DROP USER 'username'@'host';
这里给的是最高权限。
最后,用show master status;我们可以查询到两个关键的值(file和position),我们后面需要用到。
本地navicat连接mysql
用上面创建的用户密码连接即可,user默认权限为本地localhost,我们需要更改成%才可使用。
如果想要用本地navicat连接mysql的,可以试试下面的
- 首先,查看虚拟机设置中的网络,我们可以看到本机的ip地址。
-
- 然后我们需要把虚拟机防火墙关闭。(我这里试过将iptables防火墙加入3306端口,但还是不管用)
-
- systemctl stop firewalld.service(默认安装的是firewall防火墙)
-
- 出现进程冲突
-
- sudo kill -s 9 进程id
如果我们在登陆时遇到这个错误。
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
我们基本就可以卸载了。
- mysql启动停止命令
-
- sudo service mysql stop
-
- sudo service mysql start
-
- 卸载
-
- sudo apt-get remove mysql-server
-
- sudo apt-get autoremove mysql-server
-
- sudo apt-get remove mysql-common
-
- sudo rm /var/lib/mysql/ -R
-
- sudo rm /etc/mysql/ -R
-
- sudo apt-get autoremove mysql* --purge
-
- sudo apt-get remove apparmor
-
sudo apt-get install mysql-server mysql-common
我们这时候该登录了,我们会发现我们不知道密码,或者你遇到密码忘记的情况,我们这里介绍一下如何修改密码。
- 1、关闭服务
- sudo service mysql stop
-
- 2、修改mysql配置文件my.cnf
- 我们会发现他跟centos位置名字都不一样,但是他也在/etc下,具体位置应该是/etc/mysql/mysql.conf.d/mysqld.cnf
- sudo /etc/mysql/mysql.conf.d/mysqld.cnf
- 增加两行
- [mysqld]#这个不用写,在他下面写。
- skip-grant-tables
- skip-networking
-
- 3、然后启动mysql,就可以直接登录进去。修改密码
- use mysql;
- flush privileges;
- update user set authentication_string='password' where user='root';
- alter user 'root'@'localhost' identified with mysql_native_password by 'password';
- flush privileges;
- 停止mysql
- sudo service mysql stop
- 并且删除我们之前在mysqld.cnf增加的内容(或注释)
-
- 4.然后重新启动,密码就修改成功了
- sudo service mysql start
- 登录
- mysql -uroot -p
- 输入密码即可
1.修改mysql配置文件
sudo /etc/mysql/mysql.conf.d/mysqld.cnf
在【mysqld】下加入
server-id=101#注意这要跟上面的主库配置不一样,都是唯一的。
然后重启mysql
- sudo service mysql start
-
- 开放mysql
- sudo ufw allow mysql
- 防火墙关闭
- sudo ufw disable
- 防火墙打开
- sudo ufw enable
- 查看状态
- sudo ufw status
然后登录mysql输入以下命令
- 里面的参数上面都提到过。
- change master to master_host='主库ip地址',master_user='user',master_password='password',master_log_file='...',master_log_pos=157;
-
-
- stop slave;
- start slave;
-
- show master status;
-
- show slave status;
这时我们需要检查一下navicat是否可以访问
不出意外地话我们这里还会出现问题。无法连接。
我们这时候需要进入mysql配置文件再找到“address=127.0.0.1”这行代码,把它改成“address=0.0.0.0”即可。
然后我们一定要重启计算机。然后就可以访问了。然后我们就可以测试了。

测试结果发现,我们修改主库的表等数据,我们从库会自动更新。

行锁就是同时操作一条多条数据, 这边开事务增删改时候会上锁, 那边就不能增删改查了。

1.导入maven
- <dependency>
- <groupId>org.apache.shardingsphere</groupId>
- <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
- <version>4.0.0-RC1</version>
- </dependency>
2.配置yml
- spring:
- shardingsphere: #主从配置,修改ip即可
- datasource:
- names:
- master,slave
- # master,slave,slave1
- # 主数据源
- master: #主库
- type: com.alibaba.druid.pool.DruidDataSource
- driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://192.168.246.130:3306/reggie?characterEncoding=utf-8
- username: ys
- password: ys001024
- # 从数据源
- slave: #从库
- type: com.alibaba.druid.pool.DruidDataSource
- driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://192.168.246.128:3306/reggie?characterEncoding=utf-8
- username: ys
- password: ys001024
- # slave1: #从库
- # type: com.alibaba.druid.pool.DruidDataSource
- # driver-class-name: com.mysql.cj.jdbc.Driver
- # url: jdbc:mysql://192.168.138.102:3306/reggie?characterEncoding=utf-8
- # username: root
- # password: root
- masterslave:
- # 读写分离配置
- load-balance-algorithm-type: round_robin #轮询
- # 最终的数据源名称
- name: dataSource
- # 主库数据源名称
- master-data-source-name: master
- # 从库数据源名称列表,多个逗号分隔
- slave-data-source-names: slave
- # slave-data-source-names: slave,slave1
- props:
- sql:
- show: true #开启SQL显示,默认false
- main: #允许bean定义覆盖(这里是因为有两个DataSource(导入的这个sharing包的)创建,会发生冲突。
- allow-bean-definition-overriding: true
然后我们就可以用了,前提我们需要配置好两个mysql服务器。

注意:千万不要导错依赖。