来源:https://zh.wikipedia.org/wiki/CAP定理
在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer’s theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
一致性(Consistency):等同于所有节点访问同一份最新的数据副本。
可用性(Availability):每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据。
分区容错性(Partitiontolerance):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择[3]。
根据定理,分布式系统只能满足三项中的两项而不可能满足全部三项[4]。理解CAP理论的最简单方式是想象两个节点分处分区两侧。允许至少一个节点更新状态会导致数据不一致,即丧失了C性质。如果为了保证数据一致性,将分区一侧的节点设置为不可用,那么又丧失了A性质。除非两个节点可以互相通信,才能既保证C又保证A,这又会导致丧失P性质。
基本可用(Basically Available):基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。例如:电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。
软状态( Soft State):软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时就是软状态的体现。mysql replication的异步复制也是一种体现。
最终一致性( Eventual Consistency):最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。
1.BigTable
2.Dynamo
关键组成部分:
cassandra是log-structured engine,数据存储时,存储引擎将插入和更新的数据分组存储在内存中,并按照间隔顺序将数据以附加模式写入磁盘。一旦写入磁盘,则数据就不可变,也不会被覆盖。log-structured engine 可以避免覆盖并使用顺序I/O来更新数据,因此非常适合廉价的消费类SSD。
https://docs.datastax.com/en/ddac/doc/datastax_enterprise/dbArch/archPartitioners.html
https://docs.datastax.com/en/ddac/doc/datastax_enterprise/dbInternals/dbIntIntro.html
https://docs.datastax.com/en/dse/5.1/dse-admin/datastax_enterprise/config/configVnodeTOC.html
启用vnodes
在cassandra.yaml文件中:
1、取消注释num_tokens并设置所需的令牌数。
2、(推荐)要使用分配算法,请取消注释allocate_tokens_for_local_replication_factor ,并将其设置为数据中心中键空间的目标复制因子。如果复制发生变化,则在复制因子(RF)设置之间切换。
3、注释掉initial_token或保留未设置状态。
要将现有群集升级到vnode,请参阅在现有生产群集上启用虚拟节点。
禁用vnodes
在cassandra.yaml文件中:
1、注释掉num_tokens和 allocate_tokens_for_local_replication_factor。
2、取消注释initial_token并将其设置为1 或多节点集群的生成标记的值。
调整java虚拟机jvm可以提高性能优化或减少高内存消耗。默认使用垃圾优先回收器(G1)。
java垃圾回收器的设置,在jvm.options文件中:
对于使用G1的节点,DataStax建议尽可能大的MAX_HEAP_SIZE,最高64 GB。
参考:https://docs.datastax.com/en/ddac/doc/datastax_enterprise/operations/opsTuneJVM.html
常用参数的配置:
性能属性:
使用端口
trickle_fsync_interval_in_kb:默认值:1024.以千字节为单位的大小fsync。
storage_port:默认值7000.节点间通信的端口。
native_transport_port:默认值:9042.cql传输监听客户端的端口。
rpc_port:默认值:9160.用于客户端的Thrift端口
ssl_storage_port:默认值:7001。用于加密通信的SSL端口。除非在encryption_options中启用,否则不使用。
native_transport_port_ssl:默认值:9142。如果启用了客户端加密并且禁用了native_transport_port_ssl,则native_transport_port(默认值:9042)将加密所有流量。要同时使用未加密和加密的流量,请启用native_transport_port_ssl。
auto_snapshot:默认值 true。设置为true时,当数据库库在截断keyspace或删除表之前获取数据快照。建议设置为true,防止数据丢失。
key_cache_save_period:默认值14400.(4小时)keys存在缓存中的时间(以秒为单位),缓存保存在saved_caches_directory。保存在缓存中减少了冷启动时的I/O影响,提高启动速度。
slow_query_log_timeout_in_ms:默认值:500,节点记录慢日志。选择超过此值的查询会生成聚合日志消息以识别慢速查询。禁用设置0.
internode_authenticator:默认值:AllowAllAuthorizer,禁用授权,cassandra不需要认证。值为CassandraAuthorizer,表示存储system_auth.permissions表中的权限,当system_auth系统keyspace复制因子为1,则无法访问集群,因此当设置CassandrAuthorizer时,修改system_auth的复制因子。多数据中心,确保复制设置为NetworkTopologyStrategy。
设置vnode:
如果allocate_tokens_for_local_replication_factor 也被注释掉,则启用随机算法 。
启用vnodes
在cassandra.yaml文件中:
1、取消注释num_tokens并设置所需的令牌数。
2、(推荐)要使用分配算法,请取消注释allocate_tokens_for_local_replication_factor ,
并将其设置为数据中心中键空间的目标复制因子。如果复制发生变化,
则在复制因子(RF)设置之间切换。
3、注释掉initial_token或保留未设置状态。
禁用vnodes
在cassandra.yaml文件中:
1、注释掉num_tokens和 allocate_tokens_for_local_replication_factor。
2、取消注释initial_token并将其设置为1 或多节点集群的生成标记的值。
https://docs.datastax.com/en/ddac/doc/datastax_enterprise/config/configCassandra_yaml.html
CREATE KEYSPACE eo_cs WITH replication = {'class': 'NetworkTopologyStrategy', 'datacenter1': '3'} AND durable_writes = true;
语法:
CREATE ROLE [IF NOT EXISTS] role_name [WITH SUPERUSER = true | false | LOGIN = true | false | PASSWORD = ‘password’ | OPTIONS = option_map]
create ROLE eocs WITH SUPERUSER = false and password = ‘eocs’ and login=true;
语法:
GRANT privilege ON resource_name TO role_name
GRANT all PERMISSIONS ON KEYSPACE eo_cs TO eocs;
GRANT select ON KEYSPACE eo_cs TO eocs;
privilege选项:all permissions、alter、authorize、create、describe、execute、modify、select
REVOKE AUTHORIZE on KEYSPACE eo_cs from eocs;
语法:
drop role [if exists] role_name;
语法:
ALTER KEYSPACE keyspace_name
WITH REPLICATION = {‘class’ : ‘SimpleStrategy’, ‘replication_factor’ : N
| ‘class’ : ‘NetworkTopologyStrategy’, ‘dc1_name’ : N [, …]}
[AND DURABLE_WRITES = true|false] ;
CREATE KEYSPACE eo_im WITH replication = {'class': 'NetworkTopologyStrategy', 'datacenter1': '3'} AND durable_writes = true;
语法: alter role role_name [with [password = ‘yourpassword’] [login = true|false] [superuser = true|false] [options = map_literal]]
语法:
ALTER TABLE [keyspace_name.] table_name
[ALTER column_name TYPE cql_type]
[ADD (column_definition_list)]
[DROP column_list | COMPACT STORAGE ]
[RENAME column_name TO column_name]
[WITH table_properties];
语法:
ALTER TYPE field_name
[ALTER field_name TYPE new_cql_datatype
| ADD (field_name cql_datatype[,…])
| RENAME field_name TO new_field_name[AND …]]
list 选项:
[ALL | ALTER | AUTHORIZE | CREATE | DESCRIBE | DROP | EXECUTE | MODIFY | ROLES | SELECT | USERS]
cassandra@cqlsh> list select;
role | username | resource | permission
-----------+-----------+--------------------+------------
cassandra | cassandra | | SELECT
cassandra | cassandra | | SELECT
cassandra | cassandra | | SELECT
eo_im | eo_im | | SELECT
eocs | eocs | | SELECT
立即且不可逆地从指定表中删除所有数据,并从该表派生的任何物化视图中删除所有数据。
语法:
TRUNCATE [TABLE] [keyspace_name.table_name]
在truncate表时需要以下操作:
注意: TRUNCATE向所有节点发送JMX命令,告诉他们删除保存指定表中数据的SSTable。如果这些节点中的任何节点已关闭或未响应,则该命令将失败并输出如下消息:
truncate cycling.user_activity;
Unable to complete request: one or more nodes were unavailable.
查看集群状态
nodetool
参数:
short | long | description |
---|---|---|
-h | –host | hostname or ip address |
-p | –port | 端口号 |
-pwf | –password-file | 密码文件路径 |
-pw | –password | 密码 |
-u | –username | 用户名 |
– | 将选项与可能被误认为选项参数区分开 |
示例:
root@bj-ali-std1-data_slave-03:/# nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns Host ID Rack
UN 172.23.245.103 4.34 GiB 256 ? 49165d85-3681-4307-abd5-2b5a641a5702 rack1
UN 172.23.245.105 10.73 GiB 256 ? 899e0381-c3c7-4111-9439-7b8302be9fac rack1
UN 172.23.245.104 8.42 GiB 256 ? de72d74a-516a-4d9e-b46f-c27a2b6e6f81 rack1
说明:
status 节点运行状态:
U:up的缩写
D:down的缩写
state 集群状态:
N:normal(正常)的缩写
L:leaving(离开)的缩写
J:joining(加入)的缩写
M:moving(移动)的缩写
Owns:
每个数据中心节点拥有的数据百分比乘以复制因子。例如,节点可以拥有33%的环,但如果复制因子为3,则显示100%。
注意:如果群集使用具有不同复制策略或复制因子的键空间,请在运行nodetool status时指定键空间以获取有意义的本机信息。
1、查看快照列表:
root@cassandra-2:~# nodetool listsnapshots
2、清除快照:
root@cassandra-2:~# nodetool clearsnapshot
Requested clearing snapshot(s) for [all keyspaces]
root@cassandra-2:~# nodetool listsnapshots
Snapshot Details:
There are no snapshots
3、创建快照:
语法:nodetool -h localhost -p 7199 snapshot
root@cassandra-2:~# nodetool snapshot xn_dolphin_1
Requested creating snapshot(s) for [xn_dolphin_1] with snapshot name [1539103181091] and options {skipFlush=false}
Snapshot directory: 1539103181091
root@cassandra-2:~# nodetool listsnapshots
Snapshot Details:
Snapshot name Keyspace name Column family name True size Size on disk
1539103181091 xn_dolphin_1 dolphin_conversation_message 0 bytes 1.18 KiB
1539103181091 xn_dolphin_1 dolphin_conversation_member 0 bytes 1.02 KiB
1539103181091 xn_dolphin_1 dolphin_conversation_list 0 bytes 946 bytes
1539103181091 xn_dolphin_1 zoogate_blacklist 0 bytes 1.01 KiB
1539103181091 xn_dolphin_1 dolphin_conversation 0 bytes 1.1 KiB
1539103181091 xn_dolphin_1 dolphin_wchat_openid 0 bytes 895 bytes
1539103181091 xn_dolphin_1 dolphin_leaving_msg 0 bytes 1.27 KiB
1539103181091 xn_dolphin_1 dolphin_conversation_visitorinfo 0 bytes 1.2 KiB
1539103181091 xn_dolphin_1 dolphin_member_inout 0 bytes 1.05 KiB
1539103181091 xn_dolphin_1 zoogate_login_info 0 bytes 1.02 KiB
1539103181091 xn_dolphin_1 dolphin_conversation_result 5.1 MiB 5.1 MiB
1539103181091 xn_dolphin_1 dolphin_conversation_statistics 0 bytes 1 KiB
Total TrueDiskSpaceUsed: 5.1 MiB
4、恢复数据
从memtable中刷新一个或多个表。
语法:
nodetool < options > flush - < keyspace >(< table > …)
选项
短 | 长 | 描述 |
---|---|---|
-h | –host | 主机名或IP地址 |
-p | –port | 端口号。 |
-pwf | –password-file | 密码文件路径。 |
-pw | –password 密码。 | |
-u | –username | |
keyspace | 键空间的名称。 | |
table | 一个或多个表名,用空格分隔。 | |
– | 将选项与可能被误认为选项的参数分开。 |
描述:
指定一个键空间,后跟一个或多个要从memtable刷新到磁盘上的SSTables的表。
修复数据的一致性
在增加副本因子时,使用repair把保证数据副本个数满足需求。
在减少副本因子时,使用cleanup 来清除多余的副本数据。
集群的gossip信息
删除某个节点
nodetool removenode HostID//删除一个节点 例:./nodetool removenode ec1411fc-4ac9-473d-8374-f2fc293e6472
nodetool removenode status //查看删除状态
nodetool removenode force //如果用status发现总在等待一个节点, 行一次force停掉
nodetool removenode host_id
获取有关主机的网络信息。
重新加载种子节点列表。
将节点所有memtables数据刷新到SSTables硬盘。此操作会中断来自其他节点的监听,需要重启该节点。如果只是要讲memtables刷新到磁盘上,建议使用nodetool flush。一般在Cassandra版本升级的时候才使用这个命令。
查看表的一些信息,包括读的次数,写的次数,sstable的数量,memtable信息,压缩信息,bloomfilter信息。
和nodetool cfstats一样
统计正在压缩的任务
启动增量备份
对应nodetool disablebackup
打印垃圾收集(GC)统计信息。
Provides node status and information about the ring.
[root@tidb1 ~]# nodetool ring
Datacenter: datacenter1
==========
Address Rack Status State Load Owns Token
9217867712051363644
10.0.0.61 rack1 Up Normal 321.02 KiB ? -9218584694210041843
10.0.0.62 rack1 Up Normal 330.48 KiB ? -9217256112395284002
10.0.0.62 rack1 Up Normal 330.48 KiB ? -9210889157837833843
10.0.0.62 rack1 Up Normal 330.48 KiB ? -9171000296116146048
10.0.0.62 rack1 Up Normal 330.48 KiB ? -9152550881329104468
10.0.0.62 rack1 Up Normal 330.48 KiB ? -9105469006225184150
10.0.0.63 rack1 Up Normal 310.56 KiB ? -9101761092802475775
10.0.0.61 rack1 Up Normal 321.02 KiB ? -9038091519118775922
10.0.0.62 rack1 Up Normal 330.48 KiB ? -9030971017156121076
10.0.0.61 rack1 Up Normal 321.02 KiB ? -9026658576359436277
10.0.0.61 rack1 Up Normal 321.02 KiB ? -8988926568650120334
Provides the status of hinted handoff.
[root@tidb1 ~]# nodetool statushandoff
Hinted handoff is running
链接