Mycat知識精粹

  1. mycat是什么---作用:
    java應用程序與數(shù)據(jù)庫緊耦合-----解耦application和db
    高訪問量高并發(fā)對數(shù)據(jù)庫壓力----分庫分表,多數(shù)據(jù)源整合
    讀寫請求數(shù)據(jù)量不一致---(雙主雙從)讀寫分離(基于mysql的主從復制)
    2.Mycat的安裝
    需要事先安裝jvm環(huán)境和安裝mysql(jdk采用解壓縮,mysql:sudo apt install mysql-server),Mycat壓縮包:Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz,解壓安裝(安裝包通常放在/opt路徑下,解壓后文件通常放在/usr/local路徑下)
    windows文件拷貝到linux系統(tǒng),pscp工具,對應命令:pscp 本地文件dir root@IP:/home/dir,隨后mv移動文件到/opt路徑下(pscp/scp時提示connection refused,原因可能目標linux中沒有安裝ssh-server或沒有啟動,sudo apt-get install openssh-server命令安裝)
    linux解壓命令 tar -zxvf Mycat-server-1.6.7.1-release-20190627191042-linux.tar,隨后mv文件夾到/usr/local路徑下
    3.mycat的配置
    備份config路徑下server.xml,schema.xml,rule.xml文件
    修改配置文件server.xml
    mycat-server-config.png
    (vi模式下顯示行號:set nu,刪除多行是dnd,如d27d)修改配置文件schema.xml:
    mycat-schema-config.png
    4.Mysql遠程訪問驗證
    Mycat作為數(shù)據(jù)庫中間件,要和不同地址的數(shù)據(jù)庫建立訪問,準備3臺虛擬機數(shù)據(jù)庫地址
    mysql -uroot -p556600 -h 10.0.0.214 -P 3306
    mysql -uroot -p556600 -h 10.0.0.212 -P 3306
    mysql -uroot -p556600 -h 10.0.0.177 -P 3306
    如果無權遠程訪問,主機間授權:grant all privileges on . to root@被受限的主機IP identified by '556600';
    如果遇到報錯:Can't connect to MySQL server on (111),修改mysql配置:/etc/mysql/mysql.cnf.d/mysqld.cnf,注釋bind地址或者改成0.0.0.0,重啟mysql服務:service mysql restart
    如果遇到報錯Can't connect to MySQL server on (110),需關閉防火墻,ubuntu16.04 開啟/關閉防火墻:sudo ufw enable/sudo ufw disable
    5.Mycat的啟動/訪問
    linux系統(tǒng)中6個任意目錄都可以執(zhí)行的路徑:bin sbin usr/bin usr/sbin usr/local/bin usr/local/sbin
    控制臺啟動:mycat/bin目錄下執(zhí)行 ./mycat console(推薦)
    后臺啟動: mycat/bin目錄下執(zhí)行 ./mycat start
    運維登錄方式訪問:mysql -uuser1 -p556600 -h 10.0.0.162 -P9066
    數(shù)據(jù)查詢方式訪問:mysql -uuser1 -p556600 -h 10.0.0.162 -P8066
    注:大p和小p都要寫,并且mycat服務器本分要開啟遠程訪問,否則localhost方式只能適合訪問本地mysql而不能訪問mycat配置的數(shù)據(jù)庫

6.mysql 一主一從搭建
1.不同于redis的主從復制,redis從頭復制,替換rdb文件,而mysql從主從復制的切入點開始復制
2.從機讀主機的binary log后寫入自身的relay log,多次io操作,數(shù)據(jù)有延遲

主機配置-修改配置文件:vim /etc/mysql/mysql.conf.d/mysqld.cnf(提前備份)
1.主機唯一id server-id=1
2.啟動二進制日志 log-bin=mysql-bin
3.設置需要復制的數(shù)據(jù)庫 binlog-do-db=需要復制的主數(shù)據(jù)的名字
4.設置不需要復制的數(shù)據(jù)庫 binlog-ignore-db=mysql binlog-ignore-db=information_schema
5.設置logbin格式 binlog_format=STATEMENT(默認)

從機配置-修改配置文件:vim /etc/mysql/mysql.conf.d/mysqld.cnf(提前備份)
1.從機唯一id server-id=2
2.啟用中繼日志
relay-log=mysql-relay

重啟mysql主機從機的服務
主機從機關閉防火墻

在主機上以-hlocalhost而非主機ip方式登錄,建立賬戶并授權salve,授權命令 GRANT REPLICATION SALVE ON . TO 'slave'@'可以以這個用戶名密碼訪問主機的ip(%表示任意ip)' IDENTIFIED BY '556600';

查看主機狀態(tài)
show master status;

從機復制主機的命令 CHANGE MASTER TO MASTER_HOST = '主機ip'
,MASTER_USER='slave'
,MASTER_PASSWORD='556600'
,MASTER_LOG_FILE='mysql-bin.具體數(shù)字'---show master status信息
,MASTER_LOG_POS=722;---show master status信息
(如果報錯ERROR3021,表示已經(jīng)啟動了從機復制,需要stop slave(停止主從復制關系),然后reset master(重新配置主從),再執(zhí)行上面的語句)

啟動從機復制功能 start slave

查看從機狀態(tài)
show slave status\G;---Slave_IO_Running和Slave_SQL_Running都是Yes表示主從復制搭建成功
如果MySQL報錯:master and slave have equal MySQL server UUIDs 或者A slave with the same server_uuid/server_id as this slave has connected to the master,主要是因為兩臺虛擬服務器是經(jīng)過鏈路復制生成的,導致auto.cnf中的UUID一樣,此時vi /var/lib/mysql/auto.cnf修改auto.cnf中的UUID即可,如cd時permission denied,sudo su,cd openfiledir
注:從機一旦復制報錯,就停止復制操作,即便stop后再start slave,目前驗證下來有效的方式是刪除庫,stop slave后reset slave,start slave就可以了(實際生產(chǎn)環(huán)境可操作性待商榷)

驗證讀寫分離
基于之前mycat的配置,啟動mycat,進入配置的數(shù)據(jù)庫TESTDB(邏輯庫),use TESTDB,select * from mytbl可以查到數(shù)據(jù)
驗證查詢的配置的主機的數(shù)據(jù)還是從機的數(shù)據(jù),方式:
分別在各機器的mysqll設置set @hostname=主機名,在寫主機中執(zhí)行insert into mytbl(1,@@hostname);在mycat中看插入數(shù)據(jù)的主機名---(@@系統(tǒng)變量)
結(jié)果:顯然一定是查詢的主機,因為需要更改<dataHost>的balance屬性,通過此屬性配置讀寫分離的類型,
為了能看到讀寫分離的效果,把balance設置成2,會在兩個主機間切換查詢,實際應用場景中使用1或者3,配置負載均衡類型,目前的取值有4 種:
(1)balance="0", 不開啟讀寫分離機制,所有讀操作都發(fā)送到當前可用的 writeHost 上。
(2)balance="1",全部的 readHost 與 stand by writeHost 參與 select 語句的負載均衡,簡單的說,當雙主雙從模式(M1->S1,M2->S2,并且 M1 與 M2 互為主備),正常情況下,M2,S1,S2 都參與 select 語句的負載均衡。
(3)balance="2",所有讀操作都隨機的在 writeHost、readhost 上分發(fā)。
(4)balance="3",所有讀請求隨機的分發(fā)到 readhost 執(zhí)行,writerHost 不負擔讀壓力

7.mysql 雙主雙從搭建
基于前面的一主一從的環(huán)境,首先stop slave和reset master,刪除已存在各個機器上的mycat庫
注:提前確保都安裝了ssh,命令sudo apt-get install openssh-server
參照一主一從設置權限配置,同上修改mysql配置和主機間訪問權限,其次:
對于主機M1特殊配置增加:
log-slave-updates
auto-increment-increment = 2
auto-increment-increment = 1
對于主機M2特殊配置增加:
log-slave-updates
auto-increment-increment = 2
auto-increment-increment = 2

s1機器reset master to m1,s2機器reset master to m2,m1機器reset master to m2,m2機器reset master to m1,命令如change master to master_host = '192.168.0.11',master_user='slave',master_password='556600',master_log_file='mysql-bin.000001',master_log_pos=154;具體master_log_file和master_log_pos以主機show master status信息為準
各主機登錄mysql,授權從機拷貝主機數(shù)據(jù),命令grant replication slave on . to slave@從機IP identified by ‘556600’;
各從機start slave,查看slave狀態(tài)

雙主雙重讀寫分離
修改schema.xml配置,其中
balance="1": 全部的readHost與stand by writeHost參與select語句的負載均衡
writeType="0": 所有寫操作發(fā)送到配置的第一個writeHost,第一個掛了切到還生存的第二個
writeType="1",所有寫操作都隨機的發(fā)送到配置的 writeHost,1.5 以后廢棄不推薦

switchType="1": 1 默認值,自動切換,-1 表示不自動切換,2 基于 MySQL 主從同步的狀態(tài)決定是否切換
mycat-schema-double-config.png

啟動mycat

分庫(啟動15,16兩臺機器,各權限和數(shù)據(jù)庫配置等配置同上)

修改schema.xml配置
mycat-schema-splitdb.png
在15機器上創(chuàng)建庫orderdb,16機器上創(chuàng)建庫userdb,啟動mycat并訪問,分別創(chuàng)建表:

客戶表 rows:20萬
CREATE TABLE customers(
id INT AUTO_INCREMENT,
NAME VARCHAR(200),
PRIMARY KEY(id)
);
訂單表 rows:600萬
CREATE TABLE orders(
id INT AUTO_INCREMENT,
order_type INT,
customer_id INT,
amount DECIMAL(10,2),
PRIMARY KEY(id)
);
最后驗證,只有customers表創(chuàng)建在了userdb,其余表創(chuàng)建在了orderdb,分庫成功

分表-水平(啟動15,16兩臺機器,各權限和數(shù)據(jù)庫配置等配置同上,刪除orders表)

修改schema.xml配置:為 orders 表設置數(shù)據(jù)節(jié)點為 dn1、dn2,并指定分片規(guī)則為 mod_rule(自定義的名字)
mycat-schema-splittb.png
mycat-rule-splittb.png

重啟mycat并創(chuàng)建orders表
插入數(shù)據(jù)(插入字段必須寫明):INSERT INTO orders(id,order_type,customer_id,amount) VALUES (1,101,100,100100);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(2,101,100,100300);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(3,101,101,120000);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(4,101,101,103000);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(5,102,101,100400);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(6,102,100,100020);
在mycat、dn1、dn2中查看orders表數(shù)據(jù)(插入的幾條數(shù)據(jù)落在了dn1和dn2各自的orders表)
mycat查詢驗證:
select * from orders;發(fā)現(xiàn)結(jié)果不是有序的,原因數(shù)據(jù)落在不同的dn節(jié)點,分別查詢不同節(jié)點后對結(jié)果集合并,需要寫明order by

分表-水平-join操作
由于對orders表進行了水平分表,對其關聯(lián)表orders_detail也要進行水平分表,否則分落在不同dn上的order的數(shù)據(jù)只能關聯(lián)上某一個dn上的表數(shù)據(jù),而關聯(lián)不上的那部分order數(shù)據(jù)進行join orders_detail數(shù)據(jù)時報錯

修改schema.xml文件
mycat-rule-splittb.png
重啟mycat并創(chuàng)建訂單詳細表 rows:600萬
CREATE TABLE orders_detail(

id INT AUTO_INCREMENT,
detail VARCHAR(2000),
order_id INT,
PRIMARY KEY(id));
插入數(shù)據(jù)INSERT INTO orders_detail(id,detail,order_id) values(1,'detail1',1);
INSERT INTO orders_detail(id,detail,order_id) VALUES(2,'detail1',2);
INSERT INTO orders_detail(id,detail,order_id) VALUES(3,'detail1',3);
INSERT INTO orders_detail(id,detail,order_id) VALUES(4,'detail1',4);
INSERT INTO orders_detail(id,detail,order_id) VALUES(5,'detail1',5);
INSERT INTO orders_detail(id,detail,order_id) VALUES(6,'detail1',6);
在mycat、dn1、dn2中運行兩個表join語句
Select o.*,od.detail from orders o inner join orders_detail od on o.id=od.order_id;

分表-水平-全局表

修改schema.xml
mycat-schema-plittb-global.png
重啟mycat并創(chuàng)建訂單狀態(tài)字典表 rows:20

CREATE TABLE dict_order_type(
id INT AUTO_INCREMENT,
order_type VARCHAR(200),
PRIMARY KEY(id)
);
然后插入數(shù)據(jù):
INSERT INTO dict_order_type(id,order_type) VALUES(101,'type1');
INSERT INTO dict_order_type(id,order_type) VALUES(102,'type2');
在Mycat、dn1、dn2中查詢表數(shù)據(jù)(dn1和dn2的dict_order_type都有數(shù)據(jù)且完全一致)

常用分片規(guī)則-枚舉

修改schema和rule以及配置文件
mycat-schema-splittb-2.png
mycat-rule-splittb-2.png
mapFile:標識配置文件名稱,type:0為int型、非0為String,defaultNode:默認節(jié)點:小于 0 表示不設置默認節(jié)點,大于等于 0 表示設置默認節(jié)點

修改partition-hash-int.txt
mycat-file-splittb-2.png

重啟mycat并創(chuàng)建表CREATE TABLE orders_ware_info
(
id INT AUTO_INCREMENT comment '編號',
order_id INT comment '訂單編號',
address VARCHAR(200) comment '地址',
areacode VARCHAR(20) comment '區(qū)域編號',
PRIMARY KEY(id)
);
插入數(shù)據(jù)
INSERT INTO orders_ware_info(id, order_id,address,areacode) VALUES (1,1,'北京','110');
INSERT INTO orders_ware_info(id, order_id,address,areacode) VALUES (2,2,'天津','120');
INSERT INTO orders_ware_info(id, order_id,address,areacode) VALUES (3,3,'蘇州','130');
結(jié)果dn1存放北京數(shù)據(jù),dn2存放天津數(shù)據(jù),非配置的北京和天津的數(shù)據(jù)默認落在dn1(問題點:物理庫還沒有創(chuàng)建表的時候,虛擬庫通過show tables可以看到配置的表信息)

常用分片規(guī)則-范圍,此分片適用于,提前規(guī)劃好分片字段某個范圍屬于哪個分片
修改schema,rule和配置文件

mycat-schema-splittb-3.png
mycat-rule-splittb-3.png
mycat-file-splittb-3.png

重啟mycat并創(chuàng)建支付信息表
CREATE TABLE payment_info
(
id INT AUTO_INCREMENT comment '編號',
order_id INT comment '訂單編號',
payment_status INT comment '支付狀態(tài)',
PRIMARY KEY(id)
);
插入數(shù)據(jù)
INSERT INTO payment_info (id,order_id,payment_status) VALUES (1,101,0);
INSERT INTO payment_info (id,order_id,payment_status) VALUES (2,102,1);
INSERT INTO payment_info (id,order_id ,payment_status) VALUES (3,103,0);
INSERT INTO payment_info (id,order_id,payment_status) VALUES (4,104,1);
INSERT INTO payment_info (id,order_id,payment_status) VALUES (5,-1000,1);
INSERT INTO payment_info (id,order_id,payment_status) VALUES (6,1000,1);
結(jié)果dn1存放0-102數(shù)據(jù),dn2存放102-200數(shù)據(jù),非配置的區(qū)間段里的數(shù)據(jù)落到默認dn1(問題點:物理庫還沒有創(chuàng)建表的時候,虛擬庫通過show tables可以看到配置的表信息)

常用分片規(guī)則-日期
修改schema,rule配置

mycat-schema-splittb-4.png

mycat-rule-splittb-4.png
sEndDate:結(jié)束日期,則代表數(shù)據(jù)達到了這個日期的分片后循環(huán)從開始分片插入
sPartionDay :分區(qū)天數(shù),即默認從開始日期算起,分隔 2 天一個分區(qū)
重啟mycat并創(chuàng)建login_info表
CREATE TABLE login_info
(
id INT AUTO_INCREMENT comment '編號',
user_id INT comment '用戶編號',
login_date date comment '登錄日期',
PRIMARY KEY(id)
);

插入數(shù)據(jù):
INSERT INTO login_info(id,user_id,login_date) VALUES (1,101,'2019-01-01');
INSERT INTO login_info(id,user_id,login_date) VALUES (2,102,'2019-01-02');
INSERT INTO login_info(id,user_id,login_date) VALUES (3,103,'2019-01-03');
INSERT INTO login_info(id,user_id,login_date) VALUES (4,104,'2019-01-04');
INSERT INTO login_info(id,user_id,login_date) VALUES (5,105,'2019-01-05');
INSERT INTO login_info(id,user_id,login_date) VALUES (6,106,'2019-01-06');
INSERT INTO login_info(id,user_id,login_date) VALUES (7,107,'2019-01-07');
結(jié)果dn1存放1,2,5,6數(shù)據(jù),dn2存放3,4,7數(shù)據(jù)(問題點:物理庫還沒有創(chuàng)建表的時候,虛擬庫通過show tables可以看到配置的表信息)

全局序列--數(shù)據(jù)庫方式
在 dn1 上創(chuàng)建全局序列表和創(chuàng)建全局序列所需函數(shù)(直接在dn1上操作,未驗證配置mycat后重新,通過mycat創(chuàng)建是否有效)
CREATE TABLE MYCAT_SEQUENCE (NAME VARCHAR(50) NOT NULL,current_value INT NOT NULL,increment INT NOT NULL DEFAULT 100, PRIMARY KEY(NAME)) ENGINE=INNODB;

DELIMITER CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS VARCHAR(64) DETERMINISTIC BEGIN DECLARE retval VARCHAR(64); SET retval="-999999999,null"; SELECT CONCAT(CAST(current_value AS CHAR),",",CAST(increment AS CHAR)) INTO retval FROM MYCAT_SEQUENCE WHERE NAME = seq_name; RETURN retval; END

DELIMITER CREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50),VALUE INTEGER) RETURNS VARCHAR(64) DETERMINISTIC BEGIN UPDATE MYCAT_SEQUENCE SET current_value = VALUE WHERE NAME = seq_name; RETURN mycat_seq_currval(seq_name); END

DELIMITER CREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS VARCHAR(64) DETERMINISTIC BEGIN UPDATE MYCAT_SEQUENCE SET current_value = current_value + increment WHERE NAME = seq_name; RETURN mycat_seq_currval(seq_name); END

初始化序列表記錄
INSERT INTO MYCAT_SEQUENCE(NAME,current_value,increment) VALUES ('ORDERS', 400000,100);

修改 Mycat 配置

server.xml:
mycat-server-sequence-config.png
全局序列類型:0-本地文件,1-數(shù)據(jù)庫方式,2-時間戳方式

sequence_db_conf:
mycat-sequence-splittb.png
ORDERS這個序列在dn1這個節(jié)點上
插入數(shù)據(jù):
insert into orders(id,amount,customer_id,order_type) values(next value for
MYCATSEQ_ORDERS,1000,101,102);驗證id從400100開始

基于 HA 機制的 Mycat 高可用(4臺機器,10,20,15,16)
15安裝 HAProxy:
1準備好HAProxy安裝包,傳到/opt目錄下
2解壓到/usr/local/src
sudo tar -zxvf haproxy-1.5.18.tar.gz -C /usr/local/src
3進入解壓后的目錄,查看內(nèi)核版本,進行編譯
cd /usr/local/src/haproxy-1.5.18
uname -r
sudo make TARGET=linux310 PREFIX=/usr/local/haproxy ARCH=x86_64
TARGET=linux310,內(nèi)核版本,使用uname -r查看內(nèi)核,如:3.10.0-514.el7,此時該參數(shù)就為linux310;
ARCH=x86_64,系統(tǒng)位數(shù);
PREFIX=/usr/local/haprpxy #/usr/local/haprpxy,為haprpxy安裝路徑
make視情況按需安裝(sudo apt install make)
4編譯完成后,進行安裝
sudo make install PREFIX=/usr/local/haproxy
5安裝完成后,創(chuàng)建目錄、創(chuàng)建HAProxy配置文件
mkdir -p /usr/data/haproxy/
sudo vim /usr/local/haproxy/haproxy.conf
6向配置文件中插入以下配置信息,并保存
global
log 127.0.0.1 local0
maxconn 4096
chroot /usr/local/haproxy
pidfile /usr/data/haproxy/haproxy.pid
uid 99
gid 99
daemon
defaults
log global
mode tcp
option abortonclose
option redispatch
retries 3
maxconn 2000
timeout connect 5000
timeout client 50000
timeout server 50000
listen proxy_status
bind :48066
mode tcp
balance roundrobin
server mycat_1 192.168.0.10:8066 check inter 10s
server mycat_2 192.168.0.20:8066 check inter 10s
frontend admin_stats
bind :7777
mode http
stats enable
option httplog
maxconn 10
stats refresh 30s
stats uri /admin
stats auth admin:123123
stats hide-version
stats admin if TRUE
7啟動HAProxy
sudo /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.conf
8查看haproxy進程 ps -ef|grep haproxy
9打開瀏覽器訪問 http://192.168.0.15:7777/admin,在彈出框輸入用戶名:admin密碼:123123
10驗證mycat的高可用和haproxy負載均衡:通過HAProxy訪問Mycat:mysql -uuser1 -p556600 -h192.168.0.15 -P 48066

安裝配置keepalived此處暫時省略//todo

user 標簽權限控制

server.xml配置
mycat-server-readonly-user.png
privileges 標簽權限控制

在 user 標簽下的 privileges 標簽可以對邏輯庫(schema)、表(table)進行精細化的 DML 權限控制
privileges 標簽下的 check 屬性,如為 true 開啟權限檢查,為 false 不開啟,默認為 false
由于 Mycat 一個用戶的 schemas 屬性可配置多個邏輯庫(schema) ,所以privileges 的下級

節(jié)點 schema 節(jié)點同樣可配置多個,對多庫多表進行細粒度的 DML 權限控制
mycat-server-privileges-dml.png
其中dml配置如下:
mycat-dml.png

SQL攔截
firewall 標簽用來定義防火墻,其下
白名單:可以通過設置白名單,實現(xiàn)某主機某用戶可以訪問 Mycat,而其他主機用戶禁止訪問
黑名單;可以通過設置黑名單,實現(xiàn) Mycat 對具體 SQL 操作的攔截,如增刪改查等操作的攔截

Mycat-web 配置使用(10號機器)
1.Mycat-web 配置使用
下載安裝包http://zookeeper.apache.org/,安裝包拷貝到Linux系統(tǒng)/opt目錄下,并解壓tar -zxvf zookeeper-3.4.11.tar.gz到/usr/local路徑下
進入ZooKeeper解壓后的配置目錄(conf),復制配置文件并改名
cp zoo_sample.cfg zoo.cfg
進入ZooKeeper的命令目錄(bin),運行啟動命令sudo ./zkServer.sh start
ZooKeeper服務端口為2181,查看服務已經(jīng)啟動
netstat -ant | grep 2181
如報錯nohup: 無法運行命令'java': 沒有那個文件或目錄,把JAVA_HOME配置到zkEnv.sh文件里(JAVA_HOME="/usr/local/.....")
2.Mycat-web 安裝
下載安裝包http://www.mycat.io/,安裝包拷貝到Linux系統(tǒng)/opt目錄下,并解壓
tar -zxvf Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz到/usr/local目錄下
進入mycat-web的目錄下運行啟動命令./start.sh &
Mycat-web服務端口為8082,查看服務已經(jīng)啟動
netstat -ant | grep 8082

通過地址訪問服務
http://192.168.0.10:8082/mycat/

--最后插一句:如果schema配置文件沒有配置表創(chuàng)建在哪個dn數(shù)據(jù)節(jié)點上,默認第一個,其他的不創(chuàng)建該表
---END

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容